次の方法で共有


コンパイラの警告 (レベル 4) C4127

条件式が定数です。

解説

if ステートメントまたは while ループの制御式が定数に評価されます。 1 や true のような短い定数は一般的かつ慣用的な使用法であるため、Visual Studio 2015 Update 3 以降、このような定数を使用しても、式の中の演算の結果でない限り、警告は発生しません。

ループが途中で終了するために while ループの制御式が定数になる場合は、while ループを for ループで置き換えることを検討してください。 for ループの初期化、終了テスト、およびループのインクリメントを省略して、無限ループ (while(1) と同様) を生じさせる可能性があります。ループは for ステートメントの本体から終了できます。

次の例は、C4127 が発生する 2 つのケースと、for ループを使用して警告を回避する方法を示しています。

// C4127.cpp
// compile with: /W4
#include <stdio.h>
int main() {
   if (true) {}           // OK in VS2015 update 3 and later
   if (1 == 1) {}         // C4127
   while (42) { break; }  // C4127

   // OK
   for ( ; ; ) {
      printf("test\n");
      break;
   }
}

この警告は、条件式でコンパイル時定数が使用されている場合にも発生します。

#include <string>

using namespace std;

template<size_t S, class T>
void MyFunc()
{
   if (sizeof(T) >= S) // C4127. "Consider using 'if constexpr' statement instead"
   {
   }
}

class Foo
{
   int i;
   string s;
};

int main()
{
   Foo f;
   MyFunc<4, Foo>();
}