当在C中与getopt一起使用时,const-char*和strdup是否提供相同的函数



在下面的代码片段中,我可以将char*替换为const char*并删除strdup()函数调用并直接获取getopt()设置的optarg值吗?建议我使用constchar*来跳过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

由于optarg被声明为'extern char *optarg;',您不必使用'const char *',但最好不要修改程序的参数。我建议,这将更多地取决于您用dirbld变量调用的函数是否常量正确。如果它们是您的代码,您可以使它们成为您的代码;如果没有,您可能会发现将变量保持为非常量更简单。您对"strdup()"(这是POSIX中的标准,但不是ISO/IEC 9899:1999中的C)的调用是不必要的。

我的理解来自(http://linux.die.net/man/3/optarg)optarg指向argv缓冲区的内容,因此不需要strdup。建议使用constchar*似乎是一个合理的想法。

两者都是很好的建议。您可能不想更改dir和bld,因此将它们声明为const-char*而不是char*在任何情况下都很有用,因为编译器会检测到更多的编码错误。通过去掉strdup,您只是在避免不必要的复制(这取决于您之后对dir的处理),但它会为您的optarg创建一个别名。

最新更新