【问题标题】:Whether const char * and strdup serve the same function when used with getopt in C?在 C 中与 getopt 一起使用时,const char * 和 strdup 是否提供相同的功能?
【发布时间】:2010-09-19 23:35:01
【问题描述】:

在下面的代码 sn-p 中,我可以将 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 个空格; Linux 内核使用 8 个空格(实际上,一个制表位设置为 8)。
  • 我使用的是制表符间距 4。但是当我在这里复制代码时,它没有显示空格,所以我对齐了它。很抱歉造成混乱。

标签: c constants strdup


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-18
        • 1970-01-01
        • 1970-01-01
        • 2021-12-29
        • 1970-01-01
        • 1970-01-01
        • 2021-07-03
        • 1970-01-01
        相关资源
        最近更新 更多