C++ C2065将define分配给int时未声明的标识符

C++ C2065将define分配给int时未声明的标识符,c++,compiler-errors,c-preprocessor,C++,Compiler Errors,C Preprocessor,我对定义有一个小问题。我想把它赋给一个整数变量,但编译器说它是未声明的 下面是代码的样子: 定义.h #ifndef DEFINES_H #define DEFINES_H #define MYDEFINE 2 #endif myclass.h namespace mynamespace { class myClass { int someFunction(); }; } myclass.cxx #include "defines.h" #include "myclass.h"

我对定义有一个小问题。我想把它赋给一个整数变量,但编译器说它是未声明的

下面是代码的样子: 定义.h

#ifndef DEFINES_H
#define DEFINES_H

#define MYDEFINE 2

#endif
myclass.h

namespace mynamespace {
class myClass {
    int someFunction();
};
}
myclass.cxx

#include "defines.h"
#include "myclass.h"
namespace mynamespace {
int myClass::someFunction() {
    int var = MYDEFINE;
    return 0;
}
}
在具有int赋值的行中发生编译器错误。我还尝试使用另一个define,在上面相同的头文件中定义,作为具有相同效果的函数参数。有什么想法吗?提前谢谢

我知道使用defines是一个坏习惯,但我只扩展了一个现有的项目,并且我试图保持他们的设计方式

编辑:错误消息是:
Fehler 1错误C2065:'MYDEFINE':nichtdeklarierter Bezeichner…
正如您可能看到的,这不是真正的源代码,但我认为我在整理问题时非常小心


编辑2:谢谢你的警告提示。不同文件夹中有两个同名文件。我不知道为什么编译器没有提出这个问题。不管怎样,它现在起作用了

其他一些头文件也使用DEFINES\H


#pragma once…

的一个参数,其他一些头文件也使用DEFINES#H


一个参数表示“pragma once…”

您应该检查符号MYDEFINE是否真的定义了

检查头文件是否在 它是真的包括在内 (和汇编)。在define附近使用#warning以确保它是为myclass.cxx编译的:

#ifndef DEFINES_H
#define DEFINES_H

#define MYDEFINE 2
#warning My define is defined

#endif

如果未编译(在编译日志中找不到警告消息),请搜索定义。它可能已在其他地方定义。

您应该检查符号MYDEFINE是否已真正定义

检查头文件是否在 它是真的包括在内 (和汇编)。在define附近使用#warning以确保它是为myclass.cxx编译的:

#ifndef DEFINES_H
#define DEFINES_H

#define MYDEFINE 2
#warning My define is defined

#endif

如果它没有编译(在编译日志中找不到警告消息),请搜索DEFINES\u H。它可能已经在其他地方定义了。

让我们把它放在一起:

    #ifndef DEFINES_H
    #define DEFINES_H
    #define MYDEFINE 2
    #endif

    namespace mynamespace {
    class myClass {
        int someFunction();
    };    // note ; missing in your code
    }

    namespace mynamespace {
    int myClass::someFunction() {
        int var = MYDEFINE;
        return 0;
    }

编译过程中没有错误,因此您的#includes中有一些错误。

让我们把它们放在一起:

    #ifndef DEFINES_H
    #define DEFINES_H
    #define MYDEFINE 2
    #endif

    namespace mynamespace {
    class myClass {
        int someFunction();
    };    // note ; missing in your code
    }

    namespace mynamespace {
    int myClass::someFunction() {
        int var = MYDEFINE;
        return 0;
    }

编译过程中没有错误,因此您的#includes中有错误。

可能是因为您没有声明类。试试#包括“myclass.h”

编辑:


哦,失踪了在你的类声明之后。

它可能会抱怨你没有声明你的类。试试#包括“myclass.h”

编辑:


哦,失踪了在类声明之后。

您需要查看预处理器对代码所做的操作-尝试使用-p标志编译myclass.cxx并检查由此生成的.i文件

您需要查看预处理器对代码所做的操作-尝试使用-p标志编译myclass.cxx并检查由此生成的.i文件

请包括您收到的确切错误消息,有时魔鬼在细节中。请包括您收到的确切错误消息,有时魔鬼在细节中。这往往没有什么区别,因为您在一个项目中仍然遇到两个“defines.h”标题的问题。我要补充一点#pragma一旦特定于Microsoft,非标准。#pragma once不仅仅是MS,例如gcc也实现了它。并非所有的预处理器都能识别它,但如果您处于一个真正多样化的环境中,它将不可用。@MSalters并非如此(尽管其他编译器可能已损坏)-我只是用两个同名的头文件在不同的路径中尝试了这一点:两个头文件都能得到处理,而使用#ifdef-guards则不能。这似乎没有什么区别,由于您在项目中仍然遇到两个“defines.h”标题的问题。我想补充一点#pragma once是Microsoft特定的,而不是标准的。#pragma once不仅仅是MS,例如gcc也实现了它。它不是所有的预处理器都能识别的,但是如果你在一个非常多样化的环境中,它将不可用。@MSalters不是这样的(尽管其他编译器可能会被破坏)-我只是用两个同名的头文件在不同的路径中尝试了这个方法:两个头文件都能被处理,而使用#ifdef-guards则不能。嘿嘿,哦,好吧。我想,我不应该对示例代码这么直截了当。我想,我不应该对示例代码如此直截了当。+1很好的捕捉。小的语法错误通常会给编译器带来很多麻烦,这是一个经典的错误;还包括“myclass.h”+1个漂亮的捕获。小的语法错误通常会给编译器带来很多麻烦,这是一个经典的错误;还包括“myclass.h”。