不需要的头文件WinGDI.h

时间:2014-11-21 15:08:56

标签: c++ visual-studio-2010

我正在做一些像

这样的宏
#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?如何在不触及代码的情况下消除它?

3 个答案:

答案 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;是,并重新编译您的来源。