Что считают лучшей практикой при обращении к названию программы? Я видел:
#define PROGRAM_NAME "myprog"
printf("this is %s\n", PROGRAM_NAME);
а также:
printf("this is %s\n", argv[0]);
Я знаю, что второй подход даст мне ./myprog
вместо myprog
когда от программы не называют $PATH
и что первый подход гарантирует последовательность относительно названия программы.
Но есть ли что-либо еще, которое делает один подход выше другого?
Второй подход лучше, когда у вас есть несколько ссылок. В системах *nix иногда поведение зависит от того, как вы называете программу. Поэтому жесткое кодирование имени программы явно будет проблемой - оно никогда не сможет это проверить.
Я попытался взять лучшее из двух миров:
char const * program_name;
int main(int argc, char **argv) {
program_name = argv[0];
//...
}
Если вам нужно, чтобы имя_программы было доступно в каком-то другом файле, вы можете объявить его следующим образом:
extern char const * program_name;
Я объявляю "char const *", потому что хочу, чтобы это был указатель, который указывает на данные const. Я не уверен, правильно ли я сделал эту часть.
Второй подход может дать вам строки типа /usr/bin/myprog
, если вы выполните его таким образом; basename должно дать имя исполняемого файла (который вы можете рассматривать как имя вашей программы). ... если только он не связан симлинками... (в этом случае у вас есть имя ссылки... которое можно использовать для какого-то выбора в поведении программы).
Первый подход "фиксирует" имя программы на том, что хотел программист, независимо от того, как пользователь переименовал исполняемый файл или симлинковал (или даже хардлинковал)
Первое лучше, чем второе, если под рукой нет argv
.
#define PROGRAM_NAME "myprog"
void salute()
{
// no argv available
printf("Hello from %s\n", PROGRAM_NAME );
}
void main( int argc, char** argv )
{
salute();
}
Зависит от того, входит ли argv
в область действия или нет ...
Я обычно использую argv [0]
или базовое имя (argv [0])
, если возможно. С точки зрения пользователя, я думаю, что если они переименовывают или жестко связывают исполняемый файл (или кто-то другой делает это за них), тогда они хотят, чтобы сообщения от него отображались под тем именем, которое они используют, а не под каким-то другим именем, как оно было скомпилировано, о которых они могут знать, а могут и не знать.
Точно так же, если в будущем вы обнаружите, что хотите скомпилировать свою программу под разными именами с разными параметрами, чтобы дать разные версии, хотите ли вы обернуть #ifndef
вокруг этого #define
и убедитесь, что он определен через командную строку компилятора: -DPROGRAM_NAME = myprog_demo
, или вы просто хотите сделать это, и он работает?
Исключением может быть то, что если ваши инструкции по использованию отрывок из справочной страницы или другой документации, тогда, возможно, вы захотите встроить в него имя программы. Но тогда вы, вероятно, тоже не стали бы использовать #define
.
Реализации не обязательно должны предоставлять argv [0]
, однако, в лучших практиках переносимости можно обрабатывать и этот случай. Опять же, если ваша система не предоставляет его, то, вероятно, пользователь также не будет видеть сообщения на каком-либо терминале.
Между прочим:
#define PROGRAM_NAME "myprog"
puts("this is " PROGRAM_NAME);
Это не совсем ответ на ваш вопрос о передовых методах программирования, но я думаю, вы также должны помнить о том, что лучше для пользователя.
Лично я предпочитаю программы, ссылающиеся на самих себя, используя argv [0]
, т.е.команда, которую я вызывал, а не какое-то случайное имя, которое кодировщик жестко запрограммировал в программе. Несколько примеров, когда жестко запрограммированное имя раздражает или, по крайней мере, не помогает:
$ PATH
Единственная ситуация, когда я предпочитаю жестко заданное имя программы, - это когда я использую приложения с графическим интерфейсом. Я бы не хотел видеть "~ / foo / bar.pl" в качестве заголовка окна.