Служат ли const char * и strdup одной и той же функции при использовании с getopt в C?



В приведенном ниже фрагменте кода могу ли я заменить 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...
}
}


Я действительно не понимаю, зачем это нужно делать.

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



Спасибо,
Лию

591   3  

3 ответов:

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

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

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

Comments

    Ничего не найдено.