当前位置: 首页 > 知识库问答 >
问题:

为什么main不能是constexpr?

宁欣怿
2023-03-14

当您尝试在main中使用Constexpr时,如下所示:

constexpr int main()

gcc和clang投诉:

错误:无法将::main声明为内联

错误:'main'不允许声明为constexr

让我们看看constexpr函数的要求是什么:

constexpr函数必须满足以下要求:

  • 它必须不是虚拟的
  • 它的html" target="_blank">返回类型必须是文学类型
  • 它的每个参数都必须是文字类型

什么是文学类型?

文字类型是以下任一类型

  • void(自c 14起)

功能体必须包括什么?

  • 空语句
  • static_assert声明
  • 不定义类或枚举的typedef声明和别名声明
  • 使用声明
  • 使用指令
  • 只有一个返回语句,它只包含文字值、constexr变量和函数。

以下示例:

constexpr int main() { ; }

constexpr int main() { return 42; }

constexpr int main() {
// main defaults to return 0 
}

似乎符合所有这些要求。同样地,main是一个特殊的函数,它在程序开始时首先运行。您可以从main运行constexpr函数,为了使标记为constexpr的内容成为constexpr,它必须在constexpr上下文中运行。

那么为什么main不允许成为Constexr呢?


共有3个答案

佟颖逸
2023-03-14

将main声明为constexpr没有任何意义,原因有二:1)它是一个运行时函数。2) 它不能从其他函数调用或递归调用。

孙泉
2023-03-14

该标准为main提供了精确的签名,因此允许编译器拒绝其他签名。更具体地说,它规定main不能是Constexr静态或其他一些东西。

如果您想知道为什么,编译器被允许在main的开头插入代码(以执行诸如初始化全局变量等操作),这可能使其非Constexr(这就是为什么例如不允许程序显式调用main)。

郝哲茂
2023-03-14

不,这是不允许的。第3.6.1节中的草案C标准第3段规定:

[...]将main定义为已删除或将main声明为内联、静态或constexr的程序格式错误。[...]

main必须是一个运行时函数,正如Lightness所说的那样,它没有任何意义,因为您无法优化main。

 类似资料:
  • 问题内容: 这适用于Applet,Servlet,Midlet等的子类。 为什么他们不需要?如果我想创建一个从或类似的类开始,那是不好的设计,还是我将如何去做? 问题答案: 它实际上是好的设计,但并不明显,您想要执行的操作没有效果,因此有点反常。 这些类型的应用程序生活在容器中,因此,它们的切入点由这些容器必须遵守的标准确定。这些标准的设计者选择不将入口点称为主要入口点。您可以将功能放在重写的方法

  • 问题内容: 我刚读 ISO / IEC 9899:201x委员会草案-2011年4月12日 在其中我发现5.1.2.2.3程序终止 这表示如果您未在中指定任何return语句,并且如果程序成功运行,则main的右大括号}将返回0。 但是在下面的代码中,我没有指定任何return语句,但是它没有返回0 编译 问题答案: 该规则是在C标准的1999版本中添加的。在C90中,返回的状态未定义。 您可以通

  • 问题内容: 我尝试使用和设置元素的样式。 然而,它没有工作:表现得像,并表现得像个。 在Firefox和Chrome上都会发生这种情况,但奇怪的是,它在IE上有效。 是虫子吗?在HTML5和CSS Flexible Box Layout规范中,我都找不到应该有的特殊行为。 问题答案: 根据错误984869- 对按钮元素不起作用, 不能在纯CSS中实现(由浏览器实现),因此从CSS的角度来看,它们有

  • 伙计们,我有一个简单但令人讨厌的问题。据我所知,基本上意味着,对于该类的每个实例,这个方法将是相同的,如果我们改变它,这将改变该类的每个实例,它也被称为类方法。那么,如果我有一个类,它实现了某种格式的方法,让我们说: 为什么不能设置为静态?因为该类的每个实例的格式都是相同的。。。?

  • 由于这在开发者社区中是一个非常有争议的话题,所以随着我们更深入的理解并结合收到的反馈,我们将不断更新这篇博客。我也想推出一些限定词,所以大家都明白我们来自哪里。 我们的公司由我的联合创始人和首席技术官,瑞恩·坎贝尔领导,一位拥有18年的经验的软件架构师,过去10年在大型企业。 当我们决定使用Angular 2时,他已经熟悉Angular 1了。但是,在决定使用Angular之前,我们还在React

  • 问题内容: 如果html文件是本地文件(在我的C驱动器上),则可以使用,但是如果html文件在服务器上并且图像文件是本地文件,则无法使用。这是为什么? 任何可能的解决方法? 问题答案: 如果客户端可以请求本地文件系统文件,然后使用JavaScript找出其中的内容,则将是一个安全漏洞。 解决此问题的唯一方法是在浏览器中构建扩展。Firefox扩展和IE扩展可以访问本地资源。Chrome的限制更为严