C4127:条件表达式是常量

Chr*_*man 17 c++ visual-studio-2010 c4127

以下代码在Visual Studio 2010中生成警告C4127(条件表达式是常量)(其中alias_wchar_t是wchar_t的别名):

if (sizeof(alias_wchar_t) == sizeof(wchar_t)) // warning occurs here
{
    // do stuff
}
else
{
    // do other stuff
}
Run Code Online (Sandbox Code Playgroud)

除了抑制警告之外,解决这个问题的最优雅方法是什么?

我想出的最好的解决方案是将条件填充到静态bool中,并将其用作条件.在if-else之上和之下都有大量的代码,所以我将整个东西包装在大括号中以尽可能地限制变量的范围:

// <snip>

{
    static bool isSameSize = (sizeof(alias_wchar_t) == sizeof(wchar_t));
    if (isSameSize)
    {
        // do stuff
    }
    else
    {
        // do other stuff
    }
}

// <snip>
Run Code Online (Sandbox Code Playgroud)

这感觉非常糟糕.这似乎应该在编译时而不是运行时可解析,但预处理器不知道sizeof.是否有更清洁,更优雅的方法来解决这个问题?

Arn*_*aud 7

在 C++17 中,解决方案是使用 if constexpr:

if constexpr (sizeof(alias_wchar_t) == sizeof(wchar_t)) // warning occurs here
{
    // do stuff
}
else
{
    // do other stuff
}
Run Code Online (Sandbox Code Playgroud)

参考:Visual C++ 博客


das*_*ght 6

看起来你知道发生了什么,你对此很好.

编译器pragma适用于以下情况:

__pragma(warning(push))
__pragma(warning(disable:4127))
if (sizeof(alias_wchar_t) == sizeof(wchar_t)) {
__pragma(warning(pop))
}
Run Code Online (Sandbox Code Playgroud)

从本质上讲,您告诉编译器(更重要的是,您的代码的人类读者)您已经查看了警告,并且您知道自己在做什么.

  • 我个人认为克里斯托弗伯曼的原始解决方案更好.Pragma是编译器特定的并且过于冗长. (4认同)

Chr*_*ckl 6

除了抑制警告之外,解决这个问题的最优雅方法是什么?

这个条件在编译时是已知的,所以你也可以在编译时进行检查.不要使用if,只需让编译器插入对正确函数的调用.这是一个完整的例子:

#include <iostream>

typedef short alias_wchar_t; // for testing

template<bool Condition>
struct DoStuff
{
};

template<>
struct DoStuff<true>
{
    static void doStuff()
    {
        std::cout << "sizeof(alias_wchar_t) == sizeof(wchar_t)\n"; 
    }
};

template<>
struct DoStuff<false>
{
    static void doStuff()
    {
        std::cout << "sizeof(alias_wchar_t) != sizeof(wchar_t)\n"; 
    }
};

void doStuff()
{
    DoStuff<sizeof(alias_wchar_t) == sizeof(wchar_t)>::doStuff();
}

int main()
{
    doStuff();
}
Run Code Online (Sandbox Code Playgroud)

我是否会说,这是否比原始代码更优雅(只有关闭此编译单元的特定编译器警告)是基于意见的.

在任何情况下,这都会在VC 2013中没有任何警告/W4.

  • 您不认为您只是将要维护的代码量增加了一倍吗;) (2认同)