Лучшая практика при обращении к названию программы в C

Что считают лучшей практикой при обращении к названию программы? Я видел:

#define PROGRAM_NAME "myprog"
printf("this is %s\n", PROGRAM_NAME);

а также:

printf("this is %s\n", argv[0]);

Я знаю, что второй подход даст мне ./myprog вместо myprog когда от программы не называют $PATH и что первый подход гарантирует последовательность относительно названия программы.

Но есть ли что-либо еще, которое делает один подход выше другого?

8
задан Brian Tompsett - 汤莱恩 25 February 2016 в 09:56
поделиться

7 ответов

Второй подход лучше, когда у вас есть несколько ссылок. В системах *nix иногда поведение зависит от того, как вы называете программу. Поэтому жесткое кодирование имени программы явно будет проблемой - оно никогда не сможет это проверить.

5
ответ дан 5 December 2019 в 12:07
поделиться

Я попытался взять лучшее из двух миров:

char const * program_name;

int main(int argc, char **argv) {
   program_name = argv[0];
   //...
}

Если вам нужно, чтобы имя_программы было доступно в каком-то другом файле, вы можете объявить его следующим образом:

extern char const * program_name;

Я объявляю "char const *", потому что хочу, чтобы это был указатель, который указывает на данные const. Я не уверен, правильно ли я сделал эту часть.

5
ответ дан 5 December 2019 в 12:07
поделиться

Второй подход может дать вам строки типа /usr/bin/myprog, если вы выполните его таким образом; basename должно дать имя исполняемого файла (который вы можете рассматривать как имя вашей программы). ... если только он не связан симлинками... (в этом случае у вас есть имя ссылки... которое можно использовать для какого-то выбора в поведении программы).

Первый подход "фиксирует" имя программы на том, что хотел программист, независимо от того, как пользователь переименовал исполняемый файл или симлинковал (или даже хардлинковал)

1
ответ дан 5 December 2019 в 12:07
поделиться

Первое лучше, чем второе, если под рукой нет argv .

#define PROGRAM_NAME "myprog"

void salute()
{
     // no argv available 

     printf("Hello from %s\n", PROGRAM_NAME );
}

void main( int argc, char** argv ) 
{
     salute();
}
0
ответ дан 5 December 2019 в 12:07
поделиться

Зависит от того, входит ли argv в область действия или нет ...

0
ответ дан 5 December 2019 в 12:07
поделиться

Я обычно использую argv [0] или базовое имя (argv [0]) , если возможно. С точки зрения пользователя, я думаю, что если они переименовывают или жестко связывают исполняемый файл (или кто-то другой делает это за них), тогда они хотят, чтобы сообщения от него отображались под тем именем, которое они используют, а не под каким-то другим именем, как оно было скомпилировано, о которых они могут знать, а могут и не знать.

Точно так же, если в будущем вы обнаружите, что хотите скомпилировать свою программу под разными именами с разными параметрами, чтобы дать разные версии, хотите ли вы обернуть #ifndef вокруг этого #define и убедитесь, что он определен через командную строку компилятора: -DPROGRAM_NAME = myprog_demo , или вы просто хотите сделать это, и он работает?

Исключением может быть то, что если ваши инструкции по использованию отрывок из справочной страницы или другой документации, тогда, возможно, вы захотите встроить в него имя программы. Но тогда вы, вероятно, тоже не стали бы использовать #define .

Реализации не обязательно должны предоставлять argv [0] , однако, в лучших практиках переносимости можно обрабатывать и этот случай. Опять же, если ваша система не предоставляет его, то, вероятно, пользователь также не будет видеть сообщения на каком-либо терминале.

Между прочим:

#define PROGRAM_NAME "myprog"
puts("this is " PROGRAM_NAME);
2
ответ дан 5 December 2019 в 12:07
поделиться

Это не совсем ответ на ваш вопрос о передовых методах программирования, но я думаю, вы также должны помнить о том, что лучше для пользователя. Лично я предпочитаю программы, ссылающиеся на самих себя, используя argv [0] , т.е.команда, которую я вызывал, а не какое-то случайное имя, которое кодировщик жестко запрограммировал в программе. Несколько примеров, когда жестко запрограммированное имя раздражает или, по крайней мере, не помогает:

  • Я создал ссылку на программу
  • Я по какой-то причине переименовал двоичный файл
  • У меня есть несколько исполняемых файлов с одинаковыми базовыми именами в разных каталогах в моем $ PATH
  • Программа дает мне подсказки о других способах ее вызова, например в сообщениях об использовании

Единственная ситуация, когда я предпочитаю жестко заданное имя программы, - это когда я использую приложения с графическим интерфейсом. Я бы не хотел видеть "~ / foo / bar.pl" в качестве заголовка окна.

1
ответ дан 5 December 2019 в 12:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: