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