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

时间:2016-10-27 19:04:05

标签: c++ c-preprocessor header-files

我的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,一切都破了!

这里发生了什么? 我的模块和此标头都可以在其他地方正常工作,那么它们如何在汇总时可能会导致语法错误?

1 个答案:

答案 0 :(得分:3)

您似乎是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的宏。

考虑使用与枚举定义的所有大写不同的命名方案,因为程序员#defining一个宏通常会选择这样的名称。