2

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

谢谢,丽菊

4

3 回答 3

2

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

于 2008-10-30T12:27:43.807 回答
2

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

于 2008-10-30T23:07:48.320 回答
2

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

于 2008-10-30T23:18:05.227 回答