2009-08-27 45 views
2

我从GNU核心utils的代码工作,并发现无效使用()函数显然与设置属性“不返回的”。那么,我正在修改函数,我希望它返回(我将呼叫移除到exit())。编译器仍然抱怨“noreturn”函数返回,并且在使用Eclipse CDT调试器时,跳过代码是异常的 - 我跳过了代码行。我没有看到在.c文件中设置的功能,并且这个.c文件没有.h文件。这里是C函数属性设置(如何取消设置)用gcc

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

谢谢。

======= 感谢他们的帮助所有贡献者!简短的回答是:“GNUutils 7.4中的usage()函数在system.h中原型为 '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中的调试器实际上跳过了 代码行,导致开发人员怀疑他的感官。

+0

你尝试通过源__noreturn__(或ATTRIBUTE_NORETURN,这是在我的coreutils能找到在谷歌于codesearch版本Typedef的到)grepping? – 2009-08-27 19:11:59

+0

呃,应该是__noreturn__',该死的降价。 – 2009-08-27 19:12:34

+0

我建议在该目录中为'usage'做一个“grep”:) – 2009-08-27 19:19:27

回答

1

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

+0

我直接调用gcc,所以我没有执行任何编译行为,实际上我使用的是最小参数。 – cvsdave 2009-08-27 19:35:32

0

运行gcc -E代替gcc -c并看看结果。幸运的是,那里会有清晰的noreturn属性。

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

gcc -std=c99 -pedantic 

可能会驯服野兽。