-1

GCC 是否为所有场景生成可重入代码?

4

6 回答 6

4

不,您必须编写可重入代码。

于 2010-06-13T06:34:25.553 回答
2

可重入性是 ISO C 和 C++ 在设计上能够实现的,因此包括 GCC。编写可重入功能仍然是您的责任。

即使函数被正确编码以实现可重入,AC 编译器也不会生成可重入代码,这将是例外而不是规则,并且是出于架构限制的原因(例如没有足够的资源来支持堆栈,因此会生成静态帧)。在这些情况下,编译器文档应该清楚地说明这一点。

您可能会阅读的一些文章:

于 2010-06-13T17:23:59.927 回答
2

不,GCC 不保证您编写的代码。这是编写可重入代码的好链接。

https://www.ibm.com/support/knowledgecenter/en/ssw_aix_71/generalprogramming/writing_reentrant_thread_safe_code.html

于 2020-07-08T18:00:39.723 回答
1

可重入不是编译器可以控制的——由程序员编写可重入代码。为此,您需要避免所有明显的陷阱,例如全局变量(包括局部静态变量)、共享资源、线程、对其他不可重入函数的调用等。

话虽如此,一些小型嵌入式系统的交叉编译器,例如 8051,默认情况下可能不会生成可重入代码,您可能必须通过例如#pragma.

于 2010-06-13T13:41:42.447 回答
1

GCC 至少在它编译的大多数平台上生成可重入代码(特别是如果您避免按值传递或返回结构),但特定语言或平台 ABI 可能另有规定。您需要更加具体才能做出更具决定性的陈述;我知道如果正在编译的代码本身基本上是可重入的,那么它在桌面处理器上肯定是可重入的(当然,奇怪的全局状态技巧可以让你在任何平台上遇到麻烦)。

于 2010-06-13T17:30:14.440 回答
0

不,GCC 不可能保证您编写的可重入代码。

但是,在主要平台上,编译器生成或包含的代码(例如数学内在函数或函数调用)是可重入的。由于 GCC 不支持非可重入函数调用很常见的平台,例如 8051,因此编译器出现可重入问题的风险很小。

有些 GCC 端口存在错误和问题,例如 MSP430 版本。

于 2010-06-13T07:03:33.987 回答