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

この変更を加えてソースをコンパイルすると、未使用の label に関する警告が表示さyyerrlab1れますが、黙って無視することができます。

このソリューションは、コードの意図した機能には影響しません。

于 2012-11-02T15:43:10.833 に答える