0

GHSコンパイラでは、ステートメントを介さずに複数のセミコロンが連続している場合、診断メッセージ (警告) が生成されます。例えば:

void myfunc()
{
}; // warning #381-D: extra ';' ignored.

これはあまり一般的な状況ではないように思えますが、この警告は前処理が発生した後にも発行されるため、次の場合にも警告が生成されます (リリースでコンパイルされた場合)。

#if _DEBUG
  #define DEBUG_VAR(x) x
#else
  #define DEBUG_VAR(x) 
#endif

void myfunc()
{
}
// global variable, used only in debug
DEBUG_VAR(int x); // warning #381-D: extra ';' ignored.

この場合、これを回避する簡単な方法があることを認識しています。これは単なる例です。プリプロセッサには、似たような構成になる可能性のある状況が他にもたくさんあります。

明らかに、コードは正当な C++ であり、私が使用した他のコンパイラでこのような警告メッセージに遭遇したことはありません。この警告が役立つ理由についての合理的な説明はありますか?たとえば、この警告がプログラミング エラーを示している可能性がある特定のケースはありますか?

4

2 に答える 2

-3

この警告が役立つ理由についての合理的な説明はありますか?たとえば、この警告がプログラミング エラーを示している可能性がある特定のケースはありますか?

ほとんどの場合、確かに?

には意味がないので;、冗長性として書いた (そして「なぜ?」と尋ねなければならない) か、これが重要なのですが、誤ってその前のコードを削除してしまったか、何か他のことを間違えて書いたかのどちらかです。これはパーサーを混乱させ、実際にはそうではないのに冗長であるかのように; 見せました。

とはいえ、頭の中で、例が思い浮かびません。

しかし、そのマクロは次のように書くほうがよいでしょう:

#include <type_traits>
#ifndef NDEBUG
   #define DEBUG_VAR(T, N) std::common_type<T>::type N;
#else
   #define DEBUG_VAR(T, N)
#endif

void myfunc()
{}

// global variable, used only in debug
DEBUG_VAR(int, x)
于 2015-05-19T13:56:06.697 に答える