2017-03-28 2 views
0

マクロから展開されたコードでg ++警告を無効にしようとしています。私の理解では、_Pragmaはマクロの使用法に従うべきで、g++してコンパイルされたときに、これはWparenthesesをトリガしないでください。G ++無視_Pragma診断

#include <stdio.h> 

#define TEST(expr) \ 
    int a = 1; \ 
    _Pragma("GCC diagnostic push") \ 
    _Pragma("GCC diagnostic ignored \"-Wparentheses\"") \ 
    if (a <= expr) { \ 
     printf("filler\n"); \ 
    } \ 
    _Pragma("GCC diagnostic pop") 

int main(){ 
    int b = 2, c = 3; 
    TEST(b == c); 
} 

私はg++でこれをコンパイルすると、私は無効にしようとしていますWparentheses警告を取得します。

[email protected]:/mnt/c/ubuntu$ g++ -Wall -Wextra test3.c 
test3.c: In function ‘int main()’: 
test3.c:8:11: warning: suggest parentheses around comparison in operand of ‘==’ [-Wparentheses] 
    if (a <= expr) { \ 
     ^
test3.c:15:5: note: in expansion of macro ‘TEST’ 
    TEST(b == c); 
    ^

予想通りgccを使用している場合、それは動作しますが:

[email protected]:/mnt/c/ubuntu$ gcc -Wall -Wextra test3.c 
test3.c: In function ‘main’: 
test3.c:16:1: warning: control reaches end of non-void function [-Wreturn-type] 
} 
^ 

私はg++バージョン4.8.5を使用しています。

+0

gcc 4.8.5は、投稿されたソースコードを 'gcc -Wall -Wextra test3.c'でコンパイルしません。 iostreamはCヘッダファイルではないので、 'fatal error:iostream:No such file or directory'で失敗します。実際のコードを投稿してください。 –

+0

@MikeKinghan申し訳ありませんが、質問を促した.cppファイルからコピーが貼り付けられました。今は 'printf'を使用しています – Xarn

答えて

0

長いがあります。 g ++フロントエンドを使用しているときに存在しない_Pragmaのg ++​​処理のバグを理解してください。唯一の解決策は、十分に最新のバージョンのg ++​​(IIRC 6+)に進むか、TU全体の警告を無効にすることです。

0

通常、サードパーティのコードから生じる避けられない警告に対処するためにのみ、警告抑制を使用して、コンパイルログを乱雑にしません。あなたのケースでは、それは

1の方が良いでしょう)マクロは

2悪であるため、通常の関数を使用)の周りに丸括弧を追加することによる警告との契約潜在的に壊れて表現

if (a <= (expr)) { 
+0

問題のコードは最小の例です。実際のコードでは、 'a'はオーバーロードされた' <= '演算子を使って魔法を実行する特別な型のインスタンスです。 – Xarn

+1

[演算子のオーバーロードのガイドライン](http://stackoverflow.com/questions/4421706/operator-overloading/4421708#4421708)オーバーロードされた演算子に魔法を実行させることをお勧めします(私はあなたのケースで推測する<= bool、 ?)は一般的には良い考えではなく、しばしば論理的な欠陥を示します。それらをマクロに混ぜることはさらに悪いことです。 – dodo951

+0

私は[Catch](https://github.com/philsquared/Catch)と友人が同意していないと確信しています。 – Xarn

関連する問題