【问题标题】:warning C4003: not enough actual parameters for macro 'max' - Visual Studio 2010 C++警告 C4003:宏“max”的实际参数不足 - Visual Studio 2010 C++
【发布时间】:2011-07-30 15:22:18
【问题描述】:

在 Visual Studio 2010 SP1 上编译 openFrameworks 007 项目时出现以下警告:

d:\pedro\development\videoflow\openframeworks\libs\openframeworks\types\ofcolor.h(127): warning C4003: not enough actual parameters for macro 'max'
d:\pedro\development\videoflow\openframeworks\libs\openframeworks\types\ofcolor.h(128): warning C4003: not enough actual parameters for macro 'max'
d:\pedro\development\videoflow\openframeworks\libs\openframeworks\graphics\ofpixels.h(150): warning C4003: not enough actual parameters for macro 'max'
d:\pedro\development\videoflow\openframeworks\libs\openframeworks\graphics\ofpixels.h(151): warning C4003: not enough actual parameters for macro 'max'

据我所知,这个警告通常会出现错误,但就我而言,一切正常。受影响的代码如下:

const float srcMax = ( (sizeof(SrcType) == sizeof(float) ) ? 1.f : numeric_limits<SrcType>::max() );
const float dstMax = ( (sizeof(PixelType) == sizeof(float) ) ? 1.f : numeric_limits<PixelType>::max() );

我尝试在预处理器上设置 NOMINMAX,但由于 openFrameworks 还在 ofConstants.h 上定义了 NOMINMAX,我收到一堆警告,表明 NOMINMAX 已定义。

我试图在受影响的 openFrameworks 文件上定义 NOMINMAX,但它会产生相同的警告(事实上,如果我分析包含在 ofColor.h 和 ofPixel.h 中的文件,它们最终会包含 ofConstants.h 所以应该定义 NOMINMAX )。

关于如何解决这个问题的任何想法?如果你不...什么是最好的?这个警告还是一堆已经定义了 NOMINMAX 的警告?

编辑:

顺便说一句,当我谈到错误时,我指的是这些:warning C4003 and errors C2589 and C2059 on: x = std::numeric_limits<int>::max();

如果我尝试在一个干净的 C++ 项目上重现该问题,我会得到这个(警告加上 2 个错误)。但是在我的 openFrameworks 项目中,我只收到了警告。这就是为什么我会感到困惑!

【问题讨论】:

    标签: c++ visual-studio compiler-warnings openframeworks


    【解决方案1】:

    你不是第一个被这些古老的宏咬伤的人。他们无法删除它们,这会破坏旧代码。所以他们想出了另一个宏来消除刺痛。让它看起来像这样:

    #ifndef NOMINMAX
    # define NOMINMAX
    #endif
    #include <windows.h>
    // Rest of your #includes here
    //...
    

    【讨论】:

    • 为了避免有关重新定义的警告,#ifndef NOMINMAX #define NOMINMAX #endif #include &lt;windows.h&gt;
    【解决方案2】:

    在相关文件的顶部添加#undef max

    【讨论】:

    • 别忘了先#ifdef max
    • @DeadMG 为什么?它只是好的风格吗?我在 IdeOne 上尝试过,没有收到任何警告或错误。
    • 问题是有问题的文件不是我的代码。它是 openFrameworks 的代码,如果库得到更新,更改库源代码可能是 PITA。
    • @DeadMG:允许#undef max(或任何其他标识符),即使它未定义为宏。
    • 我最终能够找到问题所在。我在我的代码 winsock2.h 和 ws2tcpip.h 中包含了其他地方,这些文件包括 windows.h,这导致了问题。我把#define NOMAXMIN 放在includes 之前,它现在就像一个魅力。尽管如此,我还是接受了这个答案,因为它是“禁用”windows.h 上定义的最小/最大宏的正确答案,而另一个答案从一开始就提供了正确的做法(如果可能的话,这是最好的做法但并不是我一开始就面临的问题)。
    【解决方案3】:
    #pragma warning (disable: 4003)
    

    【讨论】:

      【解决方案4】:
      #ifdef _WIN32
      #pragma warning(push)
      #pragma warning(disable : 4003) 
      #endif
      
      ... // code with min/max warning you wish to suppress
      
      #ifdef _WIN32
      #pragma warning(pop)
      #endif
      

      【讨论】:

      • 您能否解释您的答案,提供相关官方文档的链接并解释为什么此答案/解决方案优于/优于其他答案/解决方案?
      猜你喜欢
      • 2012-03-22
      • 1970-01-01
      • 2011-04-11
      • 2010-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-08
      • 1970-01-01
      相关资源
      最近更新 更多