【问题标题】:compilation error in macro宏编译错误
【发布时间】:2011-08-21 12:09:07
【问题描述】:

我下载了jsvm软件,编译时遇到很多错误。少数如下。

/usr/include/c++/4.3/bits/algorithmfwd.h:248:41: error: macro "max" passed 3 arguments, but takes just 2

而文件algorithmfwd.h如下

 template<typename _Tp>
const _Tp&
min(const _Tp&, const _Tp&);
template<typename _Tp, typename _Compare>
const _Tp&
min(const _Tp&, const _Tp&, _Compare);

// 最小元素

【问题讨论】:

  • 你的错误是'max',你的代码显示'min'...
  • 如果为“宏”,您的代码会显示“模板”,则您的错误。
  • 其实是宏展开的错误。这发生在模板被解析之前(预处理步骤)。

标签: c++ makefile compiler-errors


【解决方案1】:

错误非常明确:

/usr/include/c++/4.3/bits/algorithmfwd.h:248:41: 错误:宏“max”传递了 3 个参数,但只需要 2 个

在包含该特定标头之前,您已经定义了一个 max,它接受 3 个参数。宏是邪恶的,因为它们适用于标识符出现的任何地方。查看您在代码中定义该宏的位置并将其删除,或者至少将其更改为大写(宏的通用约定),以便它不会在所有其他标题中扩展。

【讨论】:

    【解决方案2】:

    在某处,您定义了一个宏 max,如果您 包括标准库中的任何头文件(它有一组 名为max 的重载函数。你必须找出这个 宏被定义,并摆脱它。两种直接的可能性来了 记住:

    • 您已在其中一个标题中将其定义为宏。摆脱它。
    • Microsoft 定义(或定义——我没有检查 VC10)`min` 和 `max` 作为其标题之一中的宏。将/DNOMINMAX 添加到 你的编译器选项来抑制这个。
    • 您无法控制的其他一些库已经定义了它。把这个包起来 私有标头中的库标头,其中包括库标头, 然后做: #undef min #undef 最大值 使用这些包装器而不是给你的库头文件(和 迫使图书馆提供者纠正这一点)。

    【讨论】:

    • 我只想指出,如果你定义一个宏compare,可能会发生类似的错误。在这种情况下,您会收到错误 "compare" passed 3 arguments, but takes just 2
    【解决方案3】:

    除了algorithmfwd.h 中的函数外,它还有一个预处理器样式的宏,也称为max。尝试查找定义此内容的人并避免包含该头文件,或者如果所有其他方法都失败,则使用#undef max

    【讨论】:

      【解决方案4】:

      您没有显示最大宏。无论如何,您似乎正在尝试使用比预期多一个参数的宏。

      编译时遇到很多错误

      尝试按顺序解决你的错误,因为一个错误会影响下一个错误。

      【讨论】:

        猜你喜欢
        • 2016-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多