Служат ли const char * и strdup одной и той же функции при использовании с getopt в C? - PullRequest
2 голосов
/ 30 октября 2008

В приведенном ниже фрагменте кода я могу заменить char * на const char * и удалить вызов функции strdup () и напрямую принять значение optarg, установленное getopt ()? Я рекомендую использовать const char *, чтобы пропустить использование функции strdup. Заранее признателен за помощь.

/* Code Snippet */
char *dir = NULL; 
char *bld = NULL;
int chr;

while ( ( chr = getopt( argc, argv, "d:a:b:f:" ) ) != -1 ) {

 switch ( chr ) {

  case 'd': //Directory parameter
   dir = strdup( optarg );
   if (dir == NULL) { /*Error*/ }

  case 'b': //Build parameter
   bld = strdup( optarg );
   if (bld == NULL) { /*Error*/ }
  ...other code...
 }
} 

Я действительно не понимаю необходимости в этом.

Редактировать: Спасибо за ответы. Это было действительно полезно. Я изменил код на const char * и пропустил вызов strdup.

Спасибо, Liju * ​​1008 *

Ответы [ 3 ]

2 голосов
/ 31 октября 2008

Поскольку optarg объявлен как 'extern char *optarg;', вам не нужно использовать 'const char *', но хорошей практикой является не изменять аргументы вашей программы. Я полагаю, что это будет зависеть больше от того, являются ли функции, которые вы вызываете с помощью переменных dir и bld, корректно ли они. Если они - ваш код, вы можете сделать их таковыми; если нет, вам может быть проще хранить переменные неконстантными. Ваш вызов «strdup()» (который является стандартным в POSIX, но не в C - как в ISO / IEC 9899: 1999) не нужен.

2 голосов
/ 31 октября 2008

Оба хороших совета. Вы, вероятно, не хотите менять dir и bld, поэтому объявление их как const char * вместо char * полезно в любом случае, потому что компилятор обнаружит больше ошибок кодирования. Избавившись от strdup, вы просто избегаете ненужной копии (в зависимости от того, что вы делаете с dir впоследствии), но это создает псевдоним для вашего optarg.

2 голосов
/ 30 октября 2008

Насколько я понимаю из (http://linux.die.net/man/3/optarg)), optarg указывает на содержимое буфера argv, поэтому в strdup нет необходимости. Предложение использовать const char * кажется разумной идеей.

...