c - 错误 : expected primary-expression before "__attribute__";

标签 c solaris

我正在为 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/

相关文章:

c - 什么操作导致 select 函数在检测套接字的写入状态时超时。

c - pthread_cancel 在 solaris 下不工作

c - 我如何判断我机器上的每个核心是否使用相同的计时器?

软件可以在裸机上执行吗?

c FILE 程序错误 : double free or corruption

linux - 如何在 Oracle Solaris 11.2 x86 和 CentOS 6.6 Final 上安装 gcc 6.x?

c - GNU g++ -G 选项,用于创建在 Solaris 上可用而不在 Linux 上可用的共享库

c - getsockopt 返回与 setsockopt 中设置的不同的 IP_TOS 值

c - 如何计算一个值是否更快?

java - Modal JDialog 在 Solaris CDE 上消失在父级后面