错误:在“__attribute__”之前预期的primary-expression;

时间:2012-11-02 15:26:36

标签: c solaris

我正在Solaris 10 for x86上编译一个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__"

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

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

作为快速和肮脏的工作,从yacc.y删除以下行:

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

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

此解决方案不会影响代码的意图功能。