如何让gcc对嵌入式系统感到高兴并且无效主要(虚空)

时间:2013-12-12 09:57:06

标签: c language-lawyer

C11 5.1.2.2.1说

  

它[main()]应定义为返回类型 int

但是,第6.7.4节引入了 _Noreturn 关键字,这似乎对于main()裸骨嵌入式系统非常有用。

声明不可退回的main()的最优雅方式是什么?是_Noreturn int main(void)吗?

3 个答案:

答案 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确实永远不会返回。