c++ 头文件在一个#include中工作正常,在另一个中导致语法错误

nhhxz33t  于 2023-03-14  发布在  其他
关注(0)|答案(2)|浏览(179)

我的C++项目中有一个遗留的头文件,大家都知道它很好,它在代码库的各个地方都能正常工作。
它确实拖入了很多其他的标头,我认为这可能是问题的一部分:

/* legacy.h: */

#include "A.h"
#include "B.h"

// (Some definitions I need)

/* A.h: */

#include "C.h" // The rabbit hole continues for another few layers

/* B.h */

#include <windows.h>
#include "D.h" // Again, this also pulls in more things

我在这个项目中写了一个新模块,几周来运行良好:

/* module.h */

// Status codes for new module
struct Status {
    enum Enum           
    {
        ALL_GOOD = 0,
        ERROR
    };
};

/* module.cpp */

#include "module.h"

// (Code that previously didn't require the legacy header)

今天,我做了一个相对较小的添加,需要拉入遗留标头。
突然之间,什么都编译不了!我得到了数百个令人困惑的语法错误,比如:
错误C2143:语法错误:“常量”前缺少“}”
奇怪的是,这些错误将在module.h或module.cpp中的不同行开始,这取决于我尝试使用头文件的顺序。
最糟糕的是,这个问题似乎与module.cpp中的新代码无关。见鬼,我甚至恢复到已经工作了几个星期的版本。这仍然可以工作,但是当我包含legacy.h的时候,一切都坏了!
这是怎么回事?我的模块和这个头文件在其他地方都能很好地工作,所以当它们放在一起时,怎么可能导致 * 语法 * 错误呢?

7d7tgy0s

7d7tgy0s1#

您似乎是legacy.h的include链中某个预处理器宏的受害者。我敢打赌,语法错误源于第一次使用Status::ERROR,如您的标题中所述:

/* module.h */

// Status codes for new module
struct Status {
    enum Enum           
    {
        ALL_GOOD = 0,
        ERROR // <- Syntax errors appear here
    };
};

在这种情况下,罪犯可能是

/* B.h */

#include <windows.h>

我认为windows.h有一个名为ERROR的宏。
考虑使用一个不同于所有大写字母的命名方案来定义枚举,因为定义宏的程序员经常会选择这样的名字。

t5zmwmid

t5zmwmid2#

我有一个类似的例子,例如编译器不理解模板类的用法:

class SGMarkupElement: public std::enable_shared_from_this<SGMarkupElement> {

gcc在<的开头抛出了一个语法错误,但是只有当包含了测试可执行文件中的行的头文件时--从相应的库实现文件中,它才编译得很好。结果是,在实现文件中我包含了memory头文件,但在测试中没有!在头文件中添加它修复了所有的语法错误。

相关问题