gpt4 book ai didi

c++ - ‘-’ token 之前的预期不合格 ID

转载 作者:搜寻专家 更新时间:2023-10-31 01:54:21 25 4
gpt4 key购买 nike

我遇到了一个奇怪的情况。我的理解是,如果我将#ifndef#define #endif 标志添加到所有 .h 文件,则包含头文件的顺序并不重要。

旧代码啊啊

#ifndef A_H
#define A_H
blah blah blah
#endif

a.cc

#include "a.h"
blah blah blah

以上代码运行良好。

现在我添加了一个新的 header 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 指令顺序很重要。我不知道这个问题可能发生在哪里。任何人都可以给我一个线索会很有帮助。提前致谢

[已解决] 我自己解决了这个问题。但我认为可能还有其他人也坚持使用它。造成问题的原因如下

在测试.cc

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

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

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

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

最佳答案

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

这会编译得很好,因为 A 是在 B 之前定义的。翻译单位基本上是:

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 都可以不用担心其他 header 。

关于c++ - ‘-’ token 之前的预期不合格 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9769580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com