GCC 是否为所有场景生成可重入代码?
6 回答
不,您必须编写可重入代码。
可重入性是 ISO C 和 C++ 在设计上能够实现的,因此包括 GCC。编写可重入功能仍然是您的责任。
即使函数被正确编码以实现可重入,AC 编译器也不会生成可重入代码,这将是例外而不是规则,并且是出于架构限制的原因(例如没有足够的资源来支持堆栈,因此会生成静态帧)。在这些情况下,编译器文档应该清楚地说明这一点。
您可能会阅读的一些文章:
不,GCC 不保证您编写的代码。这是编写可重入代码的好链接。
可重入不是编译器可以控制的——由程序员编写可重入代码。为此,您需要避免所有明显的陷阱,例如全局变量(包括局部静态变量)、共享资源、线程、对其他不可重入函数的调用等。
话虽如此,一些小型嵌入式系统的交叉编译器,例如 8051,默认情况下可能不会生成可重入代码,您可能必须通过例如#pragma
.
GCC 至少在它编译的大多数平台上生成可重入代码(特别是如果您避免按值传递或返回结构),但特定语言或平台 ABI 可能另有规定。您需要更加具体才能做出更具决定性的陈述;我知道如果正在编译的代码本身基本上是可重入的,那么它在桌面处理器上肯定是可重入的(当然,奇怪的全局状态技巧可以让你在任何平台上遇到麻烦)。
不,GCC 不可能保证您编写的可重入代码。
但是,在主要平台上,编译器生成或包含的代码(例如数学内在函数或函数调用)是可重入的。由于 GCC 不支持非可重入函数调用很常见的平台,例如 8051,因此编译器出现可重入问题的风险很小。
有些 GCC 端口存在错误和问题,例如 MSP430 版本。