使用gcc在哪里是c函数属性集(如何取消设置)

时间:2009-08-27 19:06:21

标签: c gcc

我正在处理来自GNU核心工具的代码,并发现void usage()函数显然是使用属性“noreturn”设置的。好吧,我正在修改函数,我希望它返回(我删除了对exit()的调用)。编译器仍然抱怨“noreturn”函数返回,并且当使用Eclipse CDT调试器时,踩到代码是异常的 - 我跳过了代码行。我没有在.c文件中看到该功能,并且该.c文件没有.h文件。

该文件是df.c.我已重命名文件df_call.c。编译器如何找到这个属性?我怎么能解开它?

感谢。

======= 感谢所有贡献者的帮助!简短的回答是“GNUutils 7.4中的usage()函数是在system.h中的原型 'void usage(int status)ATTRIBUTE_NORETURN'。更改为'void usage(int status); / ATTRIBUTE_NORETURN; /'为我解决了这个问题,但是留下了修改后的system.h的问题。

答案很长:GNU c编译器支持为函数分配属性 (见http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html)其中一个是 “不返回的”。语法为“属性((noreturn))” (见http://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.html#Attribute-Syntax) 但通常是对ATTRIBUTE_NORETURN的宏观。如果设置了属性,则在这种情况下设置一个 尝试从函数返回,可执行文件编译投诉,但是 编译并运行。然而,它会出乎意料地行为(跳过src行 我的情况,可能是由于优化)。 Eclipse CDT中的调试器实际上跳过了 代码行,引导开发人员怀疑他的感官。

2 个答案:

答案 0 :(得分:1)

我建议您预处理源文件,以便您可以使用翻译单元的全部内容。从那里我将搜索usage以查看gcc属性可能来自何处。您还应该检查可能影响函数声明的可能的gcc命令行参数和/或宏。

答案 1 :(得分:0)

运行gcc -E而不是gcc -c并查看结果。运气好的话,很明显noreturn属性来自。

另一种选择是做我做的事情,这是避免使用特定于gcc的扩展。

gcc -std=c99 -pedantic

可以驯服野兽。