我的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,一切都破了!
这里发生了什么? 我的模块和此标头都可以在其他地方正常工作,那么它们如何在汇总时可能会导致语法错误?
答案 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一个宏通常会选择这样的名称。