C++14 中 main() 的合法定义

Posted

技术标签:

【中文标题】C++14 中 main() 的合法定义【英文标题】:Legal definitions of main() in C++14 【发布时间】:2014-12-15 17:54:19 【问题描述】:

我能找到的 C++14 的最后一个草稿说,关于 main() [3.6.1]:

实现不应预定义主要功能。该功能不得重载。它应该有一个 int 类型的返回类型,否则它的类型是实现定义的。所有实现都应允许两者

— () 返回 int 和

的函数

——(int,pointer to pointer to char)返回int的函数

和(第 5 段)

如果控制到达main末尾没有遇到return语句,效果就是执行

return 0;

这是否意味着以下所有的都是合法的 C++14 最小程序?如果没有,为什么不呢?

    auto main() -> int auto main() return 0; auto main()

【问题讨论】:

最后一个是不合法的,因为auto推导出返回类型为void。见***.com/questions/17134975/… @0x499602D2 第二个引号不是暗示返回类型应该推导出为int 用于案例3? @TristanBrindle 链接中的答案说明了这一点。 出于好奇,既然int 是唯一合法的返回类型,为什么有人要为main() 函数返回auto?那会给你带来什么? @Void Nothing。我只是好奇这在技术上是否允许。 【参考方案1】:

    合法,第二个和后一个不合法,原因如下:

    由于接受了CWG 1669,因此无法推断主函数的返回类型,标准将改写为:

    实现不应预定义主要功能。该功能不得重载。它应该有一个声明的 int 类型的返回类型,否则它的类型是实现定义的。

    这进入了 n4140。更多信息:http://wg21.cmeerw.net/cwg/issue1669

    同上

【讨论】:

永远不会推断出函数的返回类型(除了 lambda)。函数声明必须具有经典形式,返回类型在前面,或者是尾随返回类型。 @JamesKanze 对于 C++14 不再适用 我必须同意 Tristan:n4140 §7.1.6.4/p2:If the function declarator includes a trailing-return-type (8.3.5), that specifies the declared return type of the function. If the declared return type of the function contains a placeholder type, the return type of the function is deduced from return statements in the body of the function, if any. @MarcoA 我仍然不相信为什么“return 0; 的效果”不包括对案例(3)的推导 int,但是缺陷报告和随后的语言澄清让它没有实际意义。非常感谢:-) @TristanBrindle 是正确的,对不起。我忽略了它。由于第 5 段,我相信它属于同一情况。无论如何,我同意某些部分仍然是“正在进行中的工作”,并且可能存在歧义。【参考方案2】:

第一个可能是合法的。其他两个肯定不是 (§7.1.6.4/1):“自动类型说明符表示类型 被声明的变量的数量应从其推导出来 初始化器或函数声明器应包括 尾随返回类型。”

我说的可能是第一个,因为 §3.6.1 并不是很清楚 定义必须匹配到什么程度。 100% 文本匹配 不是必需的,即使这是字面意思的解释 它所说的意思是:在文本中,main 的正文是 以/* ... */ 给出,这不是很有用,当然 不是必需的。同样,传统也允许任何名称 对于argcargv,并将argv 声明为char** argv。 没有关于用尾随回报定义 main 的传统 类型,但是。我认为 §3.6.1 中的意思是 main 的所有具有相同签名的定义将是 允许,但这不是实际所说的。

无论如何:为什么要这样混淆? C/C++ 不是 帕斯卡,以及一种语言中自然的东西(如尾随 函数的返回类型)在另一个方面是混淆的。

编辑:

我刚刚下载了一份更新的草稿 (N3797),看起来 就像措辞已经改变(现在是矛盾的)。这 第一段仍然说基本相同的事情(但是 包括用于 lambdas 的附加措辞):auto 是 替换为“通过从初始化程序中推导或通过显式 带有尾随返回类型的规范。”(当然, 函数没有初始化器,所以只有 trailing-return-type 可以应用。)然而,后面的段落做 谈论从返回类型中扣除,即使 第一段需要尾随返回类型(因此 使扣除多余)。

【讨论】:

"不管怎样:为什么要这样混淆?"一个不会,我只是好奇:-)

以上是关于C++14 中 main() 的合法定义的主要内容,如果未能解决你的问题,请参考以下文章

C语言问题!让多个函数共享一个变量?

为防止溢出,C语言中应该如何定义变量

3. 在C语言程序中,在函数内部定义的变量称为全局变量。

C、C++、Java、C# 中的 main()

c语言执行程序的开始执行点是

C语言里面的常量是啥?