因此,据我所知,手册页说getopt()
takes char * const argv[]
,这是一个指向 char 的常量指针数组。同时,getopt()
permutes argv
,以便最终所有非选项都在数组的末尾。
我觉得这很令人困惑,因为现在必须逐个字符地交换字符串,而不是只交换指针,等等。为什么不只采用char * argv[]
?
5
最佳答案
1
来自Linux 的:
符合
POSIX.2 和 POSIX.1-2001,前提是设置了环境变量POSIXLY_CORRECT
。否则,的元素argv
实际上不是const
,因为我们对它们进行了排列。我们假装它们const
在原型中,以便与其他系统兼容。
因此您可以省略const
Linux 上的限定符。
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
,例如
–
|
–
glibc
扩展。–
POSIX and LSB both require these functions to take 'char *const *argv' even though this is incorrect (because of the permutation).
我认为你是对的。–
char *const *argv
早在中也是如此–
–
|