我正在为 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__"
代码有什么问题?我该如何解决?
最佳答案
该代码使用 GCC 特定的语言扩展名为 attributes表明标签可能未被使用。通常,GCC 会针对未使用的标签发出警告,因为它可能表示存在错误,但在这种情况下,由于代码是由 YACC 自动生成的,因此不确定它是否被使用。因此,此属性会在未使用时抑制警告。
您使用的编译器似乎不支持 __attribute__
语法。 #if
测试应该可以防止这种情况发生,但显然测试失败了,因为您使用的是不支持它的 GCC 的一些奇怪变体,或者您使用的是不同的编译器那是假装是 GCC。
要修复它,请尽可能切换到现代 GCC 版本,或者将编译器的 #if
测试修改为 false。快速而肮脏的修复方法是完全删除 #if
,因为 __attribute__
标记不是正确性所必需的,它只是用来删除潜在的编译器警告。
关于c - 错误 : expected primary-expression before "__attribute__";,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13198272/