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

Posted

技术标签:

【中文标题】用常量参数定义 main (const int argc, const char * const argv[])?【英文标题】:Defining main with constant arguments (const int argc, const char * const argv[])? 【发布时间】:2018-12-01 08:56:09 【问题描述】:

在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[])

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

【问题讨论】:

请注意,函数参数类型的***限定符不是函数声明的一部分,因此至少部分问题不相关。 @KerrekSB 并非无关紧要,因为我不知道这一点。问题定义明确,如果它们不是函数声明答案的一部分,我会接受。当参数未声明为常量并且您向它们发送常量指针时,我会收到 typedef 错误,所以我认为这是打字的一部分。 别误会我的意思,***常量仍然很重要。只是不是为了原型设计,因此你可以如何定义main。此外,“const char*”中的 const 不是***的,而且非常重要。 您只是好奇还是想解决问题? 【参考方案1】:

在 C 中,允许实现基本上支持 main 函数的 any 类型,因此您的特定实现很可能允许您提出的各种形式。 (而且确实似乎允许暴露环境的三参数版本。)但是,实现只是需要接受这两种形式

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)相同相同的原型,所以这里关于参数的***限定没有问题。

【讨论】:

"进一步注意int f(int)int f(const int) 是相同的原型" - 怎么样?一个实现可以使用不同的方式来传递const 和非const 参数。请提供支持您声明的标准参考。 @Olaf:在 C 中,这是通过“兼容类型”的概念来实现的;同一事物的所有类型的声明必须兼容(C11,6.7p4)。对于包括不重要的***限定符在内的函数类型的兼容性,请参见 6.7.6.3p15。 Demo. 6.7.3p10 怎么样:“要兼容的两个合格类型,两者都应具有兼容类型的相同合格版本”。对我来说,这看起来像 intconst int 不兼容,因为它们的资格不同。正如我在上面所指出的,这对于允许额外的优化是有意义的(不是我有一个特定的实现,而是我想到了 SPARC 或 Hyperstone)。不过,我可能不明白这一点,而且这些天我的湿件 CPU 冷却器有问题。

以上是关于用常量参数定义 main (const int argc, const char * const argv[])?的主要内容,如果未能解决你的问题,请参考以下文章

c++const定义的变量可以改变吗

const reference

#define与const定义常量的区别

C++中const啥意思?

C++笔记019:C++中的const修饰的是一个真正的常量

const限定符