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

if (sizeof(alias_wchar_t) == sizeof(wchar_t)) // warning occurs here
{
    // do stuff
}
else
{
    // do other stuff
}

除了抑制警告,最优雅的解决方法是什么?

我想出的最好的解决方案是将条件填充到静态 bool 中,并将其用作条件。在if-else之上和之下都有大量的代码,因此我将整个内容括在花括号中,以尽可能地限制变量的范围:
// <snip>

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

// <snip>

不过,这感觉很糟糕。看起来应该在编译时而不是运行时就可以解决,但是预处理器不知道sizeof。有没有更清洁,更优雅的方法来解决此问题?

最佳答案

看来您知道发生了什么,并且对此很好。

编译器pragma是用于以下情况的:

__pragma(warning(push))
__pragma(warning(disable:4127))
if (sizeof(alias_wchar_t) == sizeof(wchar_t)) {
__pragma(warning(pop))
}

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

关于c++ - C4127:条件表达式为常数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25573996/

10-14 16:47