我正在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__"
代码有什么问题?我该如何解决?
答案 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
,您可以默默忽略它。
此解决方案不会影响代码的意图功能。