【问题标题】:expected unqualified-id before ‘-’ token'-' 标记之前的预期 unqualified-id
【发布时间】:2012-03-19 11:47:19
【问题描述】:

我遇到了一个奇怪的情况。我的理解是,如果我将#ifndef #define #endif 标志放在所有.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

正如我所说,它在“-”标记之前使用错误预期的 unqualified-id 进行编译。

【问题讨论】:

  • #include 本质上只是一个复制粘贴过程,因此包含顺序可能很重要。请努力制作一个最小的测试用例,否则我们无法为您提供更多帮助。
  • 头文件包含顺序无关紧要,除非你在混合一些东西
  • 如果标题包含#define 宏,或者b.h 的末尾有一些错误,顺序确实 很重要。可能缺少;}
  • 没有人提到过这个错误的原因是什么:“expected unqualified-id before ‘-’ token”?我在这里看不到任何可以重现该问题的代码,因此请制作一个展示您的问题的最小示例。
  • 包括订单不应该重要,但这由您来管理。也就是说,您需要修复 a.hb.h 以便客户端包含您的标头的顺序无关紧要。这不是编译器可以为您做的事情。顺便说一句,您应该从第一个编译器错误开始,并在错误上方添加至少两行以获得好的答案,但我的猜测是在此之前- 有一些东西在 a.h i> 并且在发生错误时无法在 b.h 中访问。

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


【解决方案1】:

当然,包含顺序很重要。 include 指令基本上是在当前翻译单元中复制粘贴标题的内容。如果b.h 需要的类型在a.h 中定义,则需要在b.h 之前包含a.h,或者更好的是,包含a.h in 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;
}

这显然是一个错误。

不过,最正确的做法是在b.h中包含a.h

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

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

【讨论】:

    猜你喜欢
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 2013-07-06
    • 1970-01-01
    相关资源
    最近更新 更多