因此,据我所知,手册页说getopt()takes char * const argv[],这是一个指向 char 的常量指针数组。同时,getopt()permutes argv,以便最终所有非选项都在数组的末尾。

我觉得这很令人困惑,因为现在必须逐个字符地交换字符串,而不是只交换指针,等等。为什么不只采用char * argv[]

5

  • 1
    它不能逐个字符地交换,因为字符串的长度可能不一样。


    – 

  • 同时,getopt() 会置换 argv,这样最终所有非选项都会位于数组末尾。 这不是– 这是 GNUglibc扩展。


    – 


  • 3
    POSIX and LSB both require these functions to take 'char *const *argv' even though this is incorrect (because of the permutation).我认为你是对的。


    – 

  • @KamilCukchar *const *argv早在中也是如此


    – 


  • 相关


    – 


最佳答案
1

来自Linux 的

符合

POSIX.2 和 POSIX.1-2001,前提是设置了环境变量
POSIXLY_CORRECT。否则,的元素argv实际上不是const,因为我们对它们进行了排列。我们假装它们const在原型中,以便与其他系统兼容。

因此您可以省略constLinux 上的限定符。

6

  • 2
    const因此,您可以在 Linux 上省略限定符 ,但您可以const在传递给的数组的任何地方省略getopt()const原型中的是函数不会修改数组的承诺。GNUgetopt()破坏了const正确性。


    – 

  • 是的,显然如此。但至少他们承认了这一点。


    – 

  • 1
    我确实发现奇怪的是,该行为依赖于环境变量,而不是功能测试宏。


    – 

  • 不过,我猜他们不想#ifdef _GNU_SOURCE int getopt(int argc, char *argv[], const char *optstring); #else int getopt(int argc, char * const argv[], const char *optstring); #endif公开地承认这一点。否则标题中就会出现类似这样的内容……


    – 


  • 1
    还要注意,某些版本的手册页没有const,例如


    –