【问题标题】:solving identifier "xxx" is undefined解决标识符“xxx”未定义
【发布时间】:2009-08-17 17:00:50
【问题描述】:

我正在经历一些我不太明白的奇怪事情。

我收到如下错误:

framework/CP_STLArrayDefines.h(37): error: identifier "CP_String" is undefined
    typedef std::vector<CP_String, std::allocator<CP_String> >                      CP_Strings_Array;
                        ^
framework/CP_STLArrayDefines.h(37): error: identifier "CP_String" is undefined
    typedef std::vector<CP_String, std::allocator<CP_String> >

但如果我去查看 CP_STLArrayDefines,我显然在做:

#include "CP_String.h"

如果我去看看 CP_String.h 和 .cpp,它们看起来还不错。

它们都在同一个目录中,等等。

我应该寻找什么?

这里是 CP_STLArrayDefine.h:

#ifndef CP_STLArrayDefines_H
#define CP_STLArrayDefines_H

#ifndef TARGET_OS_LINUX
#   pragma once
#endif

// CPLAT_Framework
#include "CP_Point.h"
#include "CP_String.h"
#include "CP_Types.h"

// Standard Library
#include <vector>

CPLAT_Begin_Namespace_CPLAT

    // typedefs
#if ! TARGET_OS_LINUX
    typedef std::vector`<CP_String, std::allocator<`CP_String>` >`                      CP_Strings_Array;
    typedef std::vector`<CP_String, std::allocator<`CP_String>` >`::iterator            CP_Strings_Iterator;
    typedef std::vector`<CP_String, std::allocator<`CP_String>` >`::reverse_iterator    CP_Strings_ReverseIterator;

【问题讨论】:

  • 嗯,文件叫CP_String.h,但是你确定你感兴趣的类是?
  • 听起来像是stackoverflow.com/questions/1282212/…的变体
  • 还有,你确定头文件之间没有循环依赖?
  • @neil - 是的,这就是我想要的类,并且已经有大约 600 个源文件可以正常使用。也许这个问题的一部分与重新组织源有关。
  • 您能否在您的帖子中包含 CP_STLArrayDefines.h 的内容?至少到第 37 行。这可能会让我们更深入地了解您的问题。另外,您使用的是什么编译器和编译器版本?

标签: c++ compiler-errors


【解决方案1】:

如果您确定它不是循环包含,那么请记住,您总是可以退回到使用适当的编译器开关来转储预处理源的经常被忽视的技术,即在执行编译阶段之前让它停止。搜索它的输出,你会发现编译器为什么会抱怨,因为你现在正在查看编译器看到的内容。

MSVC 中的选项是 /E,gcc 中的选项是 -E。

【讨论】:

    【解决方案2】:

    CP_String.h 是否也可能包含 CP_STLArrayDefines.h,以便两个文件尝试相互包含?使用头文件中的包含保护,这可能会导致您描述的错误。

    【讨论】:

    • No CP_String.h 不包括 CP_STLArrayDefines.h。每个标题四边形都是正确的:
      #ifndef _H_CP_STLArrayDefines #define _H_CP_STLArrayDefines 和 #ifndef _H_CP_String #define _H_CP_String
    • 再一次,我想指出那些标题保护名称是非法的。以下划线和大写字母开头的名称保留用于 C++ 实现。
    • @neil - 所以标题保护应该是 CP_STRING_H?非法与否,但这不会是我错误的根源,对吗?
    • @indi 我不认为在这种情况下非法名称是问题,尽管您的标头保护可能有其他问题。
    • 我还注意到混合大小写的文件名是个坏主意,混合大小写的标题保护是个糟糕的主意!
    【解决方案3】:

    CP_String.h 是否得到妥善保护?我的意思是,当然是头部多包含保护。

    有没有可能,CP_String.h 之前包含的其中一个标头与保护中使用的符号相同(当您将包含保护从一个标头复制粘贴到另一个标头时会发生这种情况)。

    【讨论】:

    • 守卫是对的:#ifndef _H_CP_String #define _H_CP_String 和 #ifndef _H_CP_STLArrayDefines #define _H_CP_STLArrayDefines
    【解决方案4】:

    我没有足够的信息给您答案,但我会大胆猜测您所看到的错误的可能原因。 CP_String 是否在命名空间内声明?如果是这样,那是什么?我看到了宏调用:CPLAT_Begin_Namespace_CPLAT,我假设它做了类似using namespace CPLAT; 的事情,也许还有一些标准设置。也许,由于您在 cmets 中提到的重组,CP_String 不再位于 CPLAT 命名空间中,因此编译器找不到它。

    【讨论】:

      猜你喜欢
      • 2015-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多