使用常量参数定义 main (const int argc, const char * const argv[])?

Eva*_*oll 3 c program-entry-point arguments constants

glibc中, main 被记录为,

int main (int argc, char *argv[])
Run Code Online (Sandbox Code Playgroud)

或者,

int main (int argc, char *argv[], char *envp[])
Run Code Online (Sandbox Code Playgroud)

const如果您不想更改所有参数,您可以将它们定义为原样吗?

int main (const int argc, const char * const argv[])
Run Code Online (Sandbox Code Playgroud)

是支持、不支持还是非法?

Ker*_* SB 5

在 C 中,实现基本上可以支持函数的任何类型main,因此您的特定实现很可能允许您提出的各种形式。(事实上​​,它似乎允许公开环境的三参数版本。)但是,实现只需要接受两种形式

int main(void)
Run Code Online (Sandbox Code Playgroud)

int main(int, char**)
Run Code Online (Sandbox Code Playgroud)

由于int(int, const char**)与 的类型不同int(int, char**),严格来说,您提出的“constified”版本并不需要支持,并且属于第一条规则。然而,它很可能有效,因为char*const char*ABI 而言,它的布局方式相同,而且您提供的数据无论如何都是可变的。

进一步注意,int f(int)int f(const int)相同的原型,因此这里关于参数的顶级资格没有问题。

  • @Olaf:在C中,这是通过“兼容类型”的概念来实现的;同一事物的所有类型的声明必须兼容(C11,6.7p4)。对于函数类型的兼容性(包括顶级限定符的无意义),请参阅 6.7.6.3p15。[演示](https://wandbox.org/permlink/QitZ6D436yGG7SAz)。 (2认同)