【问题标题】:Weird compilation issue- no compiler errors for unrecognised class奇怪的编译问题 - 无法识别的类没有编译器错误
【发布时间】:2013-10-25 21:03:18
【问题描述】:

我有太多代码要发布,但我不断收到一个重复的编译错误,即在整个项目中无法识别类 Orderbk

最奇怪的是Orderbk 中没有实际的编译错误(这会导致所有其他类无法识别它,这是可以理解的)。

如果我的编译器在Orderbk 中没有发现问题,但每个引用Orderbk 的类都报告它未定义,因此有人可以给我线索吗?

1>------ Build started: Project: FXDcr (Intel C++ 13.0), Configuration: Debug x64 ------
1>  Derivative.cpp
1>C:\DXDcr\FXDcr\Instr.h(29): error : identifier "Orderbk" is undefined
1>      Orderbk getOrderbk();
1>      ^
1>  
1>C:\DXDcr\FXDcr\Instr.h(33): error : identifier "Orderbk" is undefined
1>      Orderbk orderbk;
1>      ^
1>  
1>C:\DXDcr\FXDcr\Stk.h(35): error : identifier "Orderbk" is undefined
1>          Orderbk orderbk;
1>          ^
1>  
1>  FXDcr.cpp
1>  FXMsg.cpp
1>  Fut.cpp
1>C:\DXDcr\FXDcr\Instr.h(29): error : identifier "Orderbk" is undefined
1>      Orderbk getOrderbk();
1>      ^
1>  
1>C:\DXDcr\FXDcr\Instr.h(33): error : identifier "Orderbk" is undefined
1>      Orderbk orderbk;
1>      ^
1>  
1>C:\DXDcr\FXDcr\Stk.h(35): error : identifier "Orderbk" is undefined
1>          Orderbk orderbk;
1>          ^
1>  
1>  Index.cpp
1>C:\DXDcr\FXDcr\Instr.h(29): error : identifier "Orderbk" is undefined
1>      Orderbk getOrderbk();
1>      ^
1>  
1>C:\DXDcr\FXDcr\Instr.h(33): error : identifier "Orderbk" is undefined
1>      Orderbk orderbk;
1>      ^
1>  
1>  Instr.cpp
1>C:\DXDcr\FXDcr\Stk.h(13): error : not a class or struct name
1>    class Stock : public Instr {
1>                         ^
1>  
1>C:\DXDcr\FXDcr\Stk.h(35): error : identifier "Orderbk" is undefined
1>          Orderbk orderbk;
1>          ^
1>  
1>C:\DXDcr\FXDcr\Mappings.h(31): error : identifier "Instr" is undefined
1>      static unordered_map<string, boost::shared_ptr<Instr> > GetDictOfAllInstrs();
1>                                                     ^
1>  
1>  Main.cpp
1>C:\DXDcr\FXDcr\Instr.h(29): error : identifier "Orderbk" is undefined
1>      Orderbk getOrderbk();
1>      ^
1>  
1>C:\DXDcr\FXDcr\Instr.h(33): error : identifier "Orderbk" is undefined
1>      Orderbk orderbk;
1>      ^
1>  
1>  Mappings.cpp
1>C:\DXDcr\FXDcr\Instr.h(29): error : identifier "Orderbk" is undefined
1>      Orderbk getOrderbk();
1>      ^
1>  
1>C:\DXDcr\FXDcr\Instr.h(33): error : identifier "Orderbk" is undefined
1>      Orderbk orderbk;
1>      ^
1>  
1>  Order.cpp
1>  Stock.cpp
1>C:\DXDcr\FXDcr\Instr.h(29): error : identifier "Orderbk" is undefined
1>      Orderbk getOrderbk();
1>      ^
1>  
1>C:\DXDcr\FXDcr\Instr.h(33): error : identifier "Orderbk" is undefined
1>      Orderbk orderbk;
1>      ^
1>  
1>  SIA.cpp
1>C:\DXDcr\FXDcr\Instr.h(29): error : identifier "Orderbk" is undefined
1>      Orderbk getOrderbk();
1>      ^
1>  
1>C:\DXDcr\FXDcr\Instr.h(33): error : identifier "Orderbk" is undefined
1>      Orderbk orderbk;
1>      ^
1>  
1>C:\DXDcr\FXDcr\Stk.h(35): error : identifier "Orderbk" is undefined
1>          Orderbk orderbk;
1>          ^
1>  
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

编辑我所有的头文件格式:

#ifndef CLASS_H
#define CLASS_H
class CLASS{

};
#endif

【问题讨论】:

  • 你是否包含Orderbk的标题?
  • @xorguy 我没有从其他每个 .cpp 文件中忘记它。 Orderbk 一定有问题。
  • 可能是您的包含引入了循环依赖关系。使用前向类声明来打破这些。
  • @PavelBeliy 在问题底部看到我的编辑-那些#ifndef 应该消除循环引用?
  • 也许您需要链接到图书馆?你有makefile吗?

标签: c++ debugging header compilation compiler-errors


【解决方案1】:

一个头文件在每个编译单元中只能包含一次,以避免重复定义。这是通过#ifdefs 或其他解决方案完成的。

如果你有相互依赖的标题,你会得到一个头文件循环,这会导致你在问题中提到的那种错误。

这是一个例子(我只是使用#pragma once 来表明该文件只包含一次,可能无法在任何地方使用):

头文件a.h

#pragma once
#include "b.h"
class A {
    B b_instance;
};

头文件b.h

#pragma once
#include "a.h"
class B {
    A a_instance;
};

代码文件program.cpp

#include "a.h"
#include "b.h"

编译program.cpp时,首先包含a.ha.h 所做的第一件事就是包含 b.hb.h 然后尝试包含a.h,但它会被忽略,因为它已经包含在内。然后在解析 B 类时,它找不到A,因为我们还没有在a.h 中走到那一步。

一个解决方案是在头文件中使用指针(如果可能的话)。

头文件b.h

#pragma once
class A;
class B {
    A *a_instance;
    public:
    int do_stuff();
};

有了class A 的这个前向定义,我可以使用指向它的指针,因为编译器总是知道它们的大小。但是,我不能使用a_instance = new A(); 或使用A 的成员,这必须进入b.cpp

代码文件b.cpp

#include "a.h"
int B::do_stuff() {
        a_instance = new A();
        // Or this
        A my_instance;
}

【讨论】:

  • 只需将“#pragma once”放在我的每个头文件的顶部,我仍然遇到同样的问题吗?
  • #pragma once 不是我的解决方案,它只是表明标题只包含一次。我认为您的头文件中有代码依赖于每个人,就像在我的示例中,a.hb.h 都依赖于彼此,导致编译失败。
  • 好的,我找到了循环引用 :) 将尝试重新编写它并让您知道它是否有效!
  • 我有两个!现在全部排序:)
猜你喜欢
  • 1970-01-01
  • 2016-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多