【问题标题】:gcc constexpr intepreted as inline?gcc constexpr 解释为内联?
【发布时间】:2013-05-23 16:29:20
【问题描述】:

我有这个非常简单的代码:

 constexpr int main()
 {
    return 0;
}

我从 C++11 标准 N3485 了解到这是非法的:

函数 main 不得在程序中使用。 main 的链接(3.5)是实现定义的。 将 main 定义为已删除或将 main 声明为内联、静态或 constexpr 的程序格式不正确。 名称 main 未被保留。

当我使用 gcc 4.7.2 运行它时。它输出以下错误:

prog.cpp:1:20: error: cannot declare ‘::main’ to be inline

同时,如果我从函数体中删除 return 0,它会报告相同的错误,甚至不会给出来自 main 的缺少 return 语句的警告。

这是 gcc 4.7.2 的错误吗?为什么constexpr 报告为inline?第二种现象是否意味着在main中不放return语句是可以的,还是默认return 0即使我不放return语句也可以(我知道这是不好的做法)?

谢谢。

【问题讨论】:

  • 在 C++ 中(现在也在 C 中)如果在 main 中没有 return,则暗示与 return 0; 相同。
  • @JoachimPileborg 谢谢。我会记住这个事实。

标签: c++ c++11


【解决方案1】:

main() 是唯一允许省略 return 语句的返回值函数。从 main() 的末尾流出而不返回任何内容等同于返回 0(而对于其他函数,它是未定义的行为,请参阅 6.6.3/2)。

根据 C++11 标准的第 3.6.1/5 段:

main 中的 return 语句具有离开 main 函数的效果(使用自动 存储持续时间)并以返回值作为参数调用std::exit。如果控制到达终点 的main 没有遇到return 语句,效果就是执行

return 0;

关于inline 消息,constexpr 函数隐含为inline。根据 C++11 标准 (courtesy of Luc Danton) 的第 7.1.5/2 段:

[...]。 constexpr 函数和 constexpr 构造函数是隐式的 inline (7.1.2)。

【讨论】:

  • @LucDanton 啊,这解释了为什么它会发出内联错误消息,非常感谢!
猜你喜欢
  • 2013-04-27
  • 2020-02-17
  • 1970-01-01
  • 2012-12-04
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 2015-07-02
相关资源
最近更新 更多