【问题标题】:C++ Visual Studio "Disgusting Macro Hack" compilation issueC++ Visual Studio“恶心的宏黑客”编译问题
【发布时间】:2013-10-31 21:14:01
【问题描述】:

为了我自己的理解,我正在尝试重新创建矢量类。我最近在尝试编译此代码时遇到了 Visual Studio 2013 的问题。 每个 'vector' 关键字都出现错误,其中指出:

我不知道这是我的类定义中的范围错误还是其他原因。我没有玩过任何设置。

 #include "../../../std_lib_facilities.h"

    class vector{
        int sz;
        double* elem; //pointer to the first element (of type double)

    public:
        vector(int s) :sz(s), //constructor - allocates s doubles , :size(s) is a 'initilization list'
            elem(new double[s])
        {
            for (int i = 0; i < s; i++)
                elem[i] = 0; //initialize elements

        }

        int size() const
        {
            return sz;
        }

        //read
        double get(int n)
        {
            return elem[n];
        }

        //write
        void set(int n, double v)
        {
            elem[n] = v;
        }


        //Every class that owns a resource needs a destructor
        ~vector() //destructor
        {
            delete[] elem; // free memory
        }

    };


    int main(int argc)
    {
        vector v(5);
        for (int i = 0; i < v.size(); i++){
            v.set(i, i);
            cout << "v[" << i << "]==" << v.get(i) << '\n';
        }
        system("PAUSE");

    }

如果您需要更多信息,请随时询问。

【问题讨论】:

  • 添加#undef 向量有帮助吗?
  • 头文件里有什么?
  • 我建议您将向量称为其他名称(例如 myvector),或者不要包含定义该宏的标题。如果您无法避免该标题并且不想重命名您的课程,请尝试#undef,如已建议的那样。 Microsoft 不应该将宏用于受命名空间保护的东西。这真的很低。
  • @paddy - 是 Bjarne Stroustrup 编写了该宏,而不是 Microsoft。你可能会因为在这里称 Bjarne “低”而惹上麻烦。不是微软,这很受欢迎。
  • 嗯,我受到 Bjarne Stroustrup 认为它“恶心”这一事实的保护,这比“低”更糟糕。 =) 我很想知道为什么需要宏。

标签: c++ visual-studio-2012 macros compilation


【解决方案1】:

我假设this 是您包含的std_lib_facilities.h。该文件包含一个宏

// disgusting macro hack to get a range checked vector:
#define vector Vector

这会导致代码中所有后续出现的vectorVector 替换。因此,当您声明class vector 时,它会更改为class Vector,并且由于您包含的标头已经声明了一个名为Vector 的模板类型,您可能会收到重新定义的符号错误。此外,在 main 中,当您声明 vector v(5); 时,它会更改为 Vector v(5),并且由于在 std_lib_facilities.h 中声明的原始 Vector 类需要模板参数,因此您会在您的问题中收到有关缺失的错误消息模板参数。

要解决这个问题,您可以将您的类重命名为 vector 以外的其他名称,也可以在包含 std_lib_facilities.h 后将 #undef vector 包含在内,或者您根本无法包含该标题而只包含 #include &lt;iostream&gt;,因为唯一的部分您使用的标准库是std::cout

【讨论】:

    【解决方案2】:

    在网上搜索时,我找到了您的header file...,其中包含以下行:

    // disgusting macro hack to get a range checked vector:
    #define vector Vector
    

    我不知道您为什么要使用它,但这就是您的问题的原因。

    要使用向量,您只需#include &lt;vector&gt;

    为了澄清一点,头文件创建了一个名为Vector 的向量类,然后#define 确保vector 的所有初始化实际上都引用了这个Vector 类。

    重命名你的班级将为你解决这个问题。

    顺便说一句,那个头文件很可怕,使用时要小心。

    【讨论】:

    • 关键是他们想创建自己的向量来理解。
    • @BobbyDigital 如果他们愿意,他们可以这样做。但这就是导致他的问题的原因。
    • 所以我注意到标题有using namespace std;,这不会污染vector吗?
    • 你不得不怀疑 Bjarne 是否对他的语言结果如此满意 :)
    • @HansPassant,没有static if(还)与 VLA(有点)。决定,决定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    相关资源
    最近更新 更多