0

我正在为 x86 的 Solaris 10 上编译一个 C 程序,这是一个链接的部分:

>yyerrlab1:/*Suppress GCC warning that yyerrlab1 is unused when no action*/
>#if defined (__GNUC_MINOR__)&&2093<=(__GNUC__*1000+__GNUC_MINOR__) 
> __attribute__((__unused__))
>#endif
>goto yyerrlab2;

代码写在一个名为 yacc.y 的文件中。当我通过makefile编译程序时,结果是:

>bison -d -p syn yacc.y
>yacc.y:conflicts:7shifts/reduce
>mv yacc.tab.h yacc.h
>mv yacc.tab.c yacc.c
>yacc.tab.c: in function 'int synparse()';
>yacc.tab.c:1543:error:expected primary-expression before "__attribute__"
>yacc.tab.c:1543:error:expected ";" before "__attribute__"

代码有什么问题?我该如何解决?

4

2 回答 2

3

该代码使用称为属性的特定于 GCC 的语言扩展来指示标签可能未被使用。通常,GCC 会针对未使用的标签发出警告,因为它可能表明存在错误,但在这种情况下,由于代码是由 YACC 自动生成的,因此不确定它是否被使用。因此,此属性会在未使用时抑制警告。

您使用的编译器似乎不支持该__attribute__语法。该#if测试应该可以防止这种情况发生,但显然测试失败了,要么是因为您使用了一些不支持它的奇怪 GCC 变体,要么您使用的是假装是 GCC 的不同编译器。

要修复它,请尽可能切换到现代 GCC 版本,或者#if使用您的编译器将测试修改为 false。快速而肮脏的解决方法是#if完全删除标签,因为__attribute__标签不是正确性所必需的,它只是为了删除潜在的编译器警告。

于 2012-11-02T15:44:14.603 回答
0

作为一个快速&肮脏的解决方法,从以下行中删除yacc.y

#if defined (__GNUC_MINOR__)&&2093<=(__GNUC__*1000+__GNUC_MINOR__) 
 __attribute__((__unused__))
#endif

使用此修改编译您的源代码时,它会导致一个关于未使用标签的警告yyerrlab1,您可以默默地忽略它。

此解决方案不会影响代码的预期功能。

于 2012-11-02T15:43:10.833 回答