2012-03-19 200 views
2

我遇到了一个奇怪的情况。我的理解是,如果我已将#ifndef #define #endif标志放入所有.h文件,那么包含头文件的顺序并不重要。预期' - '标记之前的非限定标识

旧代码 A.H

#ifndef A_H 
#define A_H 
    blah blah blah 
#endif 

a.cc

#include "a.h" 
blah blah blah 

而且上面的代码工作得很好。

现在我添加了一个新的头b.h

b.h

#ifndef B_H 
#define B_H 
    blah blah blah 
#endif 

新a.cc

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

以上a.cc编译OK。但是,如果我改变a.cc到

新a.cc版本2

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

编译失败,错误:之前的预期不合格的ID“ - ”标记。

对不起,我不能在一个小例子中重现相同的错误。编译错误导致了一个大项目。如果我在上面创建的一个小例子中进行测试。它编译,但如果我切换回该项目。 #include指令顺序很重要。我不知道这个问题可能发生在哪里。任何人都可以给我一个线索将是很有帮助的。 在此先感谢

[已解决] 我已经自己解决了这个问题。然而我认为也可能有其他人也会坚持下去。造成这个问题的原因是类似以下

在test.cc

const int var_undef = -1; 
#define var_undef (-1) 

它编译,而如果换成这两条线路

#define var_undef (-1) 
const int var_undef = -1 

它编译预计unqualified-错误正如我所述,在' - '标记之前的标识。

+2

'#include'本质上只是一个复制粘贴过程,所以包含顺序可能很重要。请工作来制作一个最小的测试用例,否则我们不能提供更多的帮助。 – 2012-03-19 11:49:10

+0

头文件包含顺序无关紧要,除非你在相互混合的东西 – 2012-03-19 11:50:18

+0

如果头文件包含'#define'宏,或者在'b.h'的末尾有一些错误,那么顺序*就会*重要。或许缺少';'或'}'? – 2012-03-19 11:51:14

回答

3

当然,包括订单事项。 include指令基本上复制了当前翻译单元中标题的内容。如果在a.h中定义了b.h所需的类型,则需要在b.h之前包括a.h,或者更好,还包括a.h,b.h

假设:

//a.h 
struct A 
{ 
}; 

//b.h 
struct B : public A 
{ 
}; 

//main.cc 
#include "a.h" 
#include "b.h" 
int main() 
{ 
    return 0; 
} 

AB之前定义这将汇编的罚款。翻译部将主要是:

struct A 
{ 
}; 
struct B : public A 
{ 
}; 
int main() 
{ 
    return 0; 
} 

但是,如果你相反顺序包括,你会得到:

struct B : public A 
{ 
}; 
struct A 
{ 
}; 
int main() 
{ 
    return 0; 
} 

这显然是一个错误。

然而,这样做的最正确的方法是,包括a.hb.h

//b.h 
#include "a.h" 
struct B : public A 
{ 
}; 

这样一来,谁想包括b.h,用户无需担心其他头。

相关问题