C11 5.1.2.2.1说
它[main()]应定义为返回类型 int
但是,第6.7.4节引入了 _Noreturn 关键字,这似乎对于main()
裸骨嵌入式系统非常有用。
声明不可退回的main()的最优雅方式是什么?是_Noreturn int main(void)
吗?
答案 0 :(得分:2)
您正在阅读标准的错误部分。 5.1.2.2.1是 5.1.2.2托管环境的子条款。准系统嵌入式系统不是托管系统,它是一个独立系统。所以引用的文字是无关紧要的。更多信息here。
在独立环境中声明main的最便携方式是void main (void)
。
正如另一个答案中已经提到的,gcc编译器选项是-ffreestanding
答案 1 :(得分:1)
你的目标是矛盾的。您不能要求编译器标志不是特定于编译器的。
那就是说,对于gcc来说:-ffreestanding
。
-ffreestanding
Assert that compilation takes place in a freestanding environment. This implies `-fno-builtin'. A freestanding environment is one in which the standard library may not exist, and program startup may not necessarily be at `main'. The most obvious example is an OS kernel. This is equivalent to `-fno-hosted'.
答案 2 :(得分:-1)
您错过了“或其他一些实现定义方式”的结尾。所以你的实现,即你的平台,而不是你作为程序员,可以预见到main
的不同返回类型,而某些平台会这样做。
同样根据C99和C11,您不必强制为main
指定返回值。如果你从main
返回,那么该平台应该做出合理的事情。
在任何情况下,main
都是特殊的,并遵守特殊规则。相信您的平台提供商,它为它做正确的事情。您正在谈论一个完全可以忽略的优化,以防main
确实永远不会返回。