#новичкам
Почти всегда вы пишите функцию main вот так:
int main() {
// some code
}Если вы пишите утилиту командной строки или просто хотите познать боль, то вам нужно парсить аргументы командной строки. В этом случае вы определяете main вот так:
int main (int argc, char* argv[]) {
// argc - количество переданных аргументов
// argv - массив из переданных аргументов
// some parsing
}Однако в стандарте описан еще один способ определения main:
int main(/ implementation-defined /) {body}Стандарт разрешает компиляторам давать возможность пользователям как-то по-другому задавать аргументы для main. И хоть это будет не переносимо, нам не всегда нужна кроссплатформенность.
Самая часто встречающаяся нестандартная сигнатура main следующая:
int main(int argc, char* argv[], char* envp[]) {}Третий аргумент main - это массив строк переменных окружения в формате "KEY=value". Массив завершается null pointer'ом.
Программа получает копию переменных окружения родительского процесса (например, терминала или скрипта). Только лишь независимую копию: изменение набора и значения переменных снаружи программы никак не влияет на то, что происходит внутри нее.
Вот минимальный примерчик:
#include <iostream>
int main(int argc, char* argv[], char* envp[]) {
std::cout << "Environment variables:\n";
for (char** env = envp; *env != nullptr; env++) {
std::cout << *env << "\n";
}
return 0;
}
Возможный вывод:
PATH=/usr/local/bin:/usr/bin:/bin
USER=grokaem_cpp
...
Вы не так часто можете увидеть этот формат сигнатуры main по уже очевидным для вас причинам:
- нестандарт
- а самое главное - это дело надо парсить. Засовывать в мапу какую-то и искать потом по ключу нужную переменную. А зачем, если есть std::getenv или его брат getenv из Сей.
Рассказываю про это, чтобы вы при встрече в таким форматом аргументов main не думали, что что-то базовое упустили при изучении плюсов. Ну или просто для расширения кругозора)
Expand your horizons. Stay cool.
#NONSTANDARD #goodoldc