Служат ли 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.
Спасибо,
Лию
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