【问题标题】:C2065 undeclared identifier while assigning a define to an intC2065 将定义分配给 int 时未声明的标识符
【发布时间】:2009-04-07 14:24:55
【问题描述】:

我在定义上有一个小问题。我想将它分配给一个整数变量,但编译器说它未声明。

代码如下所示: 定义.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,定义在与上面相同的头文件中,作为具有相同效果的函数参数。有任何想法吗?提前致谢。

我知道使用定义是一个坏习惯,但我只扩展现有项目,并尝试保持他们的设计方式。

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

EDIT2:感谢#warning 的提示。在不同的文件夹中有 2 个同名文件。我不知道为什么编译器没有提出这个。无论如何,它现在有效。

【问题讨论】:

  • 请包括您收到的确切错误消息,有时魔鬼在细节中。

标签: c++ compiler-errors c-preprocessor


【解决方案1】:

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

检查头文件是否在哪里 它被宣布为真正包含 (并编译)。在定义附近使用#warning 确保它是为 myclass.cxx 编译的:

#ifndef DEFINES_H
#define DEFINES_H

#define MYDEFINE 2
#warning My define is defined

#endif

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

【讨论】:

    【解决方案2】:

    让我们把它们放在一起:

        #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有问题。

    【讨论】:

    • +1 不错的收获。小的语法错误通常会给编译器带来很多痛苦,这是一个经典的错误。
    • 感谢提示,我忘记了;还有#include "myclass.h"。
    【解决方案3】:

    这可能是在抱怨你没有宣布你的班级。试试#include "myclass.h"

    编辑:

    哦,缺少';'在你的班级声明之后。

    【讨论】:

    • 呵呵,好吧。我想我不应该对示例代码这么直白。
    【解决方案4】:

    其他一些头文件也使用DEFINES_H?

    #pragma once 的一个参数...

    【讨论】:

    • 这往往没有什么区别,因为您仍然会在项目中遇到两个“defines.h”标头的问题。
    • 我会在 Microsoft 特定时添加 #pragma,而不是标准。
    • #pragma once 不仅仅是 MS,例如gcc 也实现了它。但并非所有预处理器都能识别它,因此如果您处于非常多样化的环境中,它将无法使用。
    • @MSalters 并非如此(尽管其他编译器可能已损坏)-我只是在不同路径中使用 2 个具有相同名称的头文件尝试了此操作:两者都得到处理,而使用 #ifdef 保护则不会。
    【解决方案5】:

    您需要查看预处理器对您的代码执行的操作 - 尝试使用 -P 标志编译 myclass.cxx 并检查生成的 .i 文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      • 2011-04-16
      • 2011-04-16
      • 2010-12-24
      • 2023-03-04
      • 2011-03-02
      相关资源
      最近更新 更多