使用常量参数定义main函数(const int argc,const char * const argv[])是什么意思?

3
glibc 中,main 被记录为以下之一,
int main (int argc, char *argv[])

或者,
int main (int argc, char *argv[], char *envp[])

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

int main (const int argc, const char * const argv[])

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


1
请注意,函数参数类型的顶级限定符不是函数声明的一部分,因此您问题的至少某些部分与此无关。 - Kerrek SB
@KerrekSB并不是无关的,因为我之前不知道这个问题。这个问题已经很好地定义了,如果它们不是函数声明的一部分,那么回答一下我就会接受了。当参数没有被声明为常量而你发送了常量指针时,我会得到typedef错误,所以我认为这是类型的一部分。 - Evan Carroll
不要误解我,顶层const仍然很重要。只是在原型设计的目的上不重要,因此你可以定义main。另外,“const char *”中的const不是顶层的,非常重要。 - Kerrek SB
你只是好奇还是在尝试解决一个问题? - klutt
1个回答

5
在C语言中,实现允许基本上支持任何类型的main函数,因此您特定的实现可能允许您提出的各种形式。 (事实上,它似乎允许暴露环境的三参数版本。)但是,实现仅需要接受两种形式。
int main(void)

并且

int main(int, char**)

由于 int(int, const char**)int(int, char**) 不是相同的类型,所以您提出的“constified”版本不是必须支持的,属于第一条规则。但是,很可能会工作,因为就 ABI 而言,char*const char* 的布局方式是相同的,并且您得到的数据是可变的。

另请注意,int f(int)int f(const int) 是相同的原型,因此关于参数的顶级限定符没有任何问题。


1
请注意,int f(int)int f(const int)是完全相同的原型。这是因为实现可以使用不同的方式传递const和非const参数。请提供支持您主张的标准参考。 - too honest for this site
2
@Olaf:在C语言中,这是通过“兼容类型”的概念实现的;相同声明的所有类型必须兼容(C11,6.7p4)。有关函数类型的兼容性,包括顶层限定符的非重要性,请参见6.7.6.3p15。演示 - Kerrek SB
1
6.7.3p10怎么样:“为了使两个合格类型兼容,两者都必须具有兼容类型的相同限定版本”。对我来说,这意味着intconst int不兼容,因为它们没有相同的限定。正如我上面指出的那样,这可能是有意义的,可以允许额外的优化(虽然我没有具体的实现想法,但SPARC或Hyperstone浮现在脑海中)。虽然我可能没有理解到点子上,但这些天我的湿件CPU散热器确实有问题。 - too honest for this site

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接