Для этого также имеется расширение GNU, так что можно получить доступ к имени вызова программы из-за пределов main (), не сохраняя его вручную. Однако, может быть, лучше сделать это вручную; таким образом делая его переносимым, а не полагаться на расширение GNU. Тем не менее, я привожу здесь выдержку из имеющейся документации.
С электронное руководство по библиотеке GNU C (доступно сегодня):
"Многие программы, которые не читают ввод с терминала, предназначены для выхода в случае сбоя любого системного вызова. По соглашению сообщение об ошибке такой программы должно начинаться с имени программы, без каталогов. в переменной program_invocation_short_name
; полное имя файла хранится в переменной program_invocation_name
.
Переменная: char * program_invocation_name
Значение этой переменной - это имя, которое использовалось для вызова программы, запущенной в текущем процессе. Это так же, как argv[0]
. Обратите внимание, что это не обязательно полезное имя файла; часто он не содержит имен каталогов.
Переменная: char * program_invocation_short_name
Значение этой переменной - это имя, которое использовалось для вызова программы, запущенной в текущем процессе, с удаленными именами каталогов. (То есть, это то же самое, что program_invocation_name
минус все до последнего слеша, если таковой имеется.)
Код инициализации библиотеки устанавливает обе эти переменные перед вызовом main.
Примечание по переносимости: Эти две переменные являются расширениями GNU. Если вы хотите, чтобы ваша программа работала с библиотеками не-GNU, вы должны сохранить значение argv[0]
в main, а затем удалить имена каталогов самостоятельно. Мы добавили эти расширения, чтобы позволить писать автономные подпрограммы сообщения об ошибках, которые не требуют явного взаимодействия с main. "