2016-04-25 9 views
0

GCCまたはClangに以下のエラーについて警告するにはどうすればよいですか?Mは2行目のNとなっていましたか?誤った梱包プラグマについての警告

-Wall -Wextra -Wunknown-pragmasであっても、これらのコンパイラのいずれも警告を出力しません。

#define N 4 
#pragma pack(push, M) 

int main() { 
    return 0; 
} 

#pragma pack(pop) 
+1

#ifndefのM #エラーすなわち整数または識別子を期待しているので、あなたが警告を受けますMは定義されていません #endif –

答えて

0

コンパイラは、コードが有効である場合にのみ、あなたの意図を知ることができません。あなたはこの

#ifndef M 
    #error M not defined 
#endif 

を自分で調べることができますまたはあなたは、あなたが追加した場合、プラグマは、すなわち評価されていないプリプロセッサの出力を見ればM場合は、この

#if M != N 
    #error M is not N 
#endif 
0

Nとは別に定義されていましたNプリプロセッサの実行後に4が表示されません。

私はあなたがここで警告することはできませんが、少なくとも簡単には、おそらくプリプロセッサーのウィザードがそれを理解できるかもしれないと思います。次の警告は、#ifステートメントの定義されていない値でない限り、役に立ちません。

-Wundef 

あなたがしようとプラグマすなわち

#pragma pack(push, (M + 0)) 

に何かを追加した場合、プラグマは

warning: expected integer or identifier in '#pragma pack' 
+1

あなたは '#pragma'で' M'識別子が '#pragma'と同じように扱われると仮定しているようですfdef'ディレクティブです。それは妥当と思われますが、私が知る限り、標準は完全に実装に任せています。あなたの結論を支持するGCC文書やClang文書はありますか? –

+0

@JohnBollingerあなたは正しいです、それはclangで同じように扱われていません、私が知る限り評価されていません。 – Harry

関連する問題