在' - '标记之前预期的非限定标识

时间:2012-03-19 11:47:20

标签: c++ include include-path include-guards

我遇到了一个奇怪的情况。我的理解是,如果我将#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编译好了。但是,如果我将a.cc更改为

新的a.cc版本2

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

编译失败并出现错误:在' - '标记之前预期为unqualified-id。

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

[解决]    我自己解决了这个问题。但我认为可能还有其他人也会坚持下去。导致问题的原因如下:

在test.cc中

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

它编译,而如果你交换这两行

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

如我所述,它会在' - '令牌之前编译错误预期的非限定id。

1 个答案:

答案 0 :(得分:3)

包含顺序当然很重要。 include伪指令基本上是在当前翻译单元中复制粘贴标题的内容。如果b.h中定义了a.h所需的类型,则需要在a.h之前添加b.h,或者更好的是,在<{1>}中包含a.h / strong> b.h

假设:

//a.h
struct A
{
};

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

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

这将编译正常,因为在A之前定义了B。翻译单位基本上是:

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

但是,如果你颠倒了包含的顺序,你会得到:

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

这显然是一个错误。

但是,最正确的方法是在a.h中加入b.h

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

这样,任何想要加入b.h的人都可以不用担心其他标题。