我正在做一些像
这样的宏#define report_msg(type,msg_str).......my_special_##type(......)
#define report_error(msg_str) report_msg(ERROR,msg_str)
它在linux下工作得很完美,而当我用visual studio 2010 express编译时,我发现它给出了错误
error C3861: 'my_special_0': identifier not found
原因是" ERROR"被解释为0.当我使用"去定义"在MSVC中,它转到WinGDI.h
/* Region Flags */
#define ERROR 0
问题是为什么包含这个WinGDI.h?如何在不触及代码的情况下消除它?
答案 0 :(得分:4)
这就是为什么宏是邪恶的。我见过在不同标题中使用不同值定义TRUE和FALSE的情况。在任何体面尺寸的项目中,遵循标题链可能会变得乏味。尝试
#undef ERROR
#define report_msg(type,msg_str).......my_special_##type(......)
#define report_error(msg_str) report_msg(ERROR,msg_str)
并希望在这些陈述之后不需要ERROR的“真实”定义。
答案 1 :(得分:2)
解决方案1: 交换包含一些标题的订单 - >乏味的任务
解决方案2:
将NOGDI
放在预处理器中。在Visual Studio中:项目属性 - >配置属性 - > C / C ++ - >预处理器 - >预处理器定义 - >添加NOGDI
。
<强>说明:强>
保罗指出我正确的方向。我不使用预编译的头文件,因此我不包含stdafx.h
。我的问题与Linux与Windows库有关。
在我的例子中,我使用了一个库,它为日志消息定义了常量'ERROR'。对于时间戳ctime.h
,其中包含Windows.h
/ WinGDI.h
。
答案 2 :(得分:1)
WinGDI.h
可能来自您Windows.h
的{{1}}。要确保启用&#34;显示包括&#34;选项在这里:项目设置 - &gt;配置属性 - &gt; C / C ++ - &gt;高级 - &gt;显示包含 - &gt;是,并重新编译您的来源。