Лучшая практика при обращении к названию программы на C - PullRequest
8 голосов
/ 11 июня 2010

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

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

, а также:

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

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

Но есть ли что-то еще, что делает один подход превосходящим другой?

Ответы [ 7 ]

5 голосов
/ 11 июня 2010

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

char const * program_name;

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

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

extern char const * program_name;

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

5 голосов
/ 11 июня 2010

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

2 голосов
/ 11 июня 2010

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

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

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

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

Кстати:

#define PROGRAM_NAME "myprog"
puts("this is " PROGRAM_NAME);
1 голос
/ 11 июня 2010

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

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

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

1 голос
/ 11 июня 2010

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

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

0 голосов
/ 11 июня 2010

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

0 голосов
/ 11 июня 2010

Первый превосходит последний, когда у вас нет argv под рукой.

#define PROGRAM_NAME "myprog"

void salute()
{
     // no argv available 

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

void main( int argc, char** argv ) 
{
     salute();
}
...