我的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的时候,一切都坏了!
这是怎么回事?我的模块和这个头文件在其他地方都能很好地工作,所以当它们放在一起时,怎么可能导致 * 语法 * 错误呢?
2条答案
按热度按时间7d7tgy0s1#
您似乎是legacy.h的include链中某个预处理器宏的受害者。我敢打赌,语法错误源于第一次使用Status::ERROR,如您的标题中所述:
在这种情况下,罪犯可能是
我认为windows.h有一个名为ERROR的宏。
考虑使用一个不同于所有大写字母的命名方案来定义枚举,因为定义宏的程序员经常会选择这样的名字。
t5zmwmid2#
我有一个类似的例子,例如编译器不理解模板类的用法:
gcc在
<
的开头抛出了一个语法错误,但是只有当包含了测试可执行文件中的行的头文件时--从相应的库实现文件中,它才编译得很好。结果是,在实现文件中我包含了memory
头文件,但在测试中没有!在头文件中添加它修复了所有的语法错误。