GCCまたはClangに以下のエラーについて警告するにはどうすればよいですか?M
は2行目のN
となっていましたか?誤った梱包プラグマについての警告
-Wall -Wextra -Wunknown-pragmas
であっても、これらのコンパイラのいずれも警告を出力しません。
#define N 4
#pragma pack(push, M)
int main() {
return 0;
}
#pragma pack(pop)
GCCまたはClangに以下のエラーについて警告するにはどうすればよいですか?M
は2行目のN
となっていましたか?誤った梱包プラグマについての警告
-Wall -Wextra -Wunknown-pragmas
であっても、これらのコンパイラのいずれも警告を出力しません。
#define N 4
#pragma pack(push, M)
int main() {
return 0;
}
#pragma pack(pop)
コンパイラは、コードが有効である場合にのみ、あなたの意図を知ることができません。あなたはこの
#ifndef M
#error M not defined
#endif
を自分で調べることができますまたはあなたは、あなたが追加した場合、プラグマは、すなわち評価されていないプリプロセッサの出力を見ればM
場合は、この
#if M != N
#error M is not N
#endif
でN
とは別に定義されていましたN
プリプロセッサの実行後に4
が表示されません。
私はあなたがここで警告することはできませんが、少なくとも簡単には、おそらくプリプロセッサーのウィザードがそれを理解できるかもしれないと思います。次の警告は、#if
ステートメントの定義されていない値でない限り、役に立ちません。
-Wundef
あなたがしようとプラグマすなわち
#pragma pack(push, (M + 0))
に何かを追加した場合、プラグマは
warning: expected integer or identifier in '#pragma pack'
あなたは '#pragma'で' M'識別子が '#pragma'と同じように扱われると仮定しているようですfdef'ディレクティブです。それは妥当と思われますが、私が知る限り、標準は完全に実装に任せています。あなたの結論を支持するGCC文書やClang文書はありますか? –
@JohnBollingerあなたは正しいです、それはclangで同じように扱われていません、私が知る限り評価されていません。 – Harry
#ifndefのM #エラーすなわち整数または識別子を期待しているので、あなたが警告を受けますMは定義されていません #endif –