コンパイラの警告 (レベル 1) C5105
'defined' を生成するマクロ展開に未定義の動作があります
解説
プリプロセッサは、マクロ展開の出力に defined
演算子を検出しました。 マクロの展開の結果として defined
演算子が表示される場合、C 標準では動作が undefined として指定されます。 C5105 警告は移植性と標準準拠に関する警告であり、他の適合したコンパイラでは異なる動作をする可能性があるために発行されます。 この問題を解決するには、defined
演算子をマクロから移動するか、警告 C5105 を抑制します。
Microsoft 固有の動作: MSVC コンパイラは、/permissive-
の状況下でも defined
演算子を正常に評価します。
この警告は Visual Studio 2017 バージョン 15.8 で新たに追加されたものです。 これは、/experimental:preprocessor
コンパイラ オプションで指定された新しい標準準拠のプリプロセッサでのみ生成されます。
コードを変更せずに警告をオフにするには
warning pragma、#pragma warning(suppress : 5105)
を使うことで、特定のコード行に対する警告をオフにできます。 また、警告の pragma である #pragma warning(disable : 5105)
を使用することで、ファイル内の警告をオフにできます。 コマンドライン ビルドでは、/wd5105 コマンド ライン オプションを使用して警告をグローバルにオフにできます。
Visual Studio IDE でプロジェクト全体の警告をオフにするには、次のようにします:
- プロジェクトの [プロパティ ページ] ダイアログを開きます。 [プロパティ ページ] ダイアログの使用方法の詳細については、プロパティ ページを参照してください。
- [構成プロパティ] > [C/C++] > [詳細] ページを選択します。
- [特定の警告を無効にする] プロパティを編集して
5105
を追加します。 [OK] をクリックして変更を適用します。
例
このサンプル プログラムは、警告 C5105 を生成する方法とその修正方法を示しています。
// C5105.cpp
// To demonstrate the warning,
// compile by using: cl /EHsc /experimental:preprocessor /DTEST C5105.cpp
// To fix the warning, change the DEFINED_TEST
// definition to the commented version.
#include <iostream>
#define DEFINED_TEST defined TEST
//#if defined TEST
//#define DEFINED_TEST 1
//#else
//#define DEFINED_TEST 0
//#endif
int main()
{
#if DEFINED_TEST // C5105
std::cout << "TEST defined\n";
#else
std::cout << "TEST not defined\n";
#endif
}