Ответ 1
Это не всегда. Это значение, которое вы дали программе в операционной системе. Например, при запуске программы с помощью exec
вы можете установить ее на произвольное значение:
int execve(const char *filename, char *const argv[],
char *const envp[]);
Первым параметром является файл для запуска, а argv будет содержать argv [0] и все остальные параметры для main. envp содержит переменные среды (не определенные стандартным C или С++. Это позиция).
Точнее, это определение argv в С++:
Реализация не должна предопределять основную функцию. Эта функция не должна быть перегружена. Он должен имеют тип возвращаемого типа int, но в противном случае его тип определяется реализацией. Все реализации должны допускать оба следующих определения main:
int main() { /* ... */ }
и
int main(int argc, char* argv[]) { /* ... */ }
В последней форме argc должно быть количество аргументов, переданных программе из среды в который запускается программой. Если argc отличен от нуля, эти аргументы должны быть представлены в
argv[0]
черезargv[argc-1]
как указатели на начальные символы многобайтовых строк с нулевым завершением (NTMBS) (17.3.2.1.3.2) иargv[0]
должен быть указателем на начальный символ NTMBS, который представляет имя, используемое для вызова программы или "". Величина argc должна быть неотрицательной. Значениеargv[argc]
должно быть 0. [Примечание: рекомендуется добавлять дополнительные (необязательные) параметры после ARGV. ]
Это в значительной степени соответствует реализации, определяющей "имя, используемое для вызова программы". Если вы хотите получить полный путь к своему исполняемому файлу, вы можете использовать GetModuleFileName в Windows и argv[0]
(для получения имени, используемого для выполнения, может быть относительным) вместе с getcwd
(для получения текущего рабочего каталога, пытаясь сделать абсолютное имя).