阻止C预处理器执行特定的宏替换

时间:2008-11-14 22:08:10

标签: c++ c-preprocessor getmessage

如何告诉预处理器不要替换特定的宏?

具体问题如下:Windows头文件定义了GetMessage宏。

我的API的My C ++头文件有一个GetMessage方法。我不想重命名我的方法。但是在Windows上使用API​​时,包括windows.h用GetMessageA替换了我的GetMessage方法调用。

5 个答案:

答案 0 :(得分:6)

你试过做一次

吗?
#undef GetMessage

甚至

#ifdef GetMessage
#undef GetMessage
#endif

然后直接调用Windows GetMessageA或GetMessageW,以适当的方式。

你应该知道你是否正在使用char * for wchar_t8 ..

(感谢don.neufeld)

布莱恩也说过 Jus一些有用的信息,您也可以使用#pragma push_macro / pop_macro来推送和弹出宏定义。如果要覆盖代码块中的宏定义,这非常有用:

#pragma push_macro("GetMessage")
#undef GetMessage

// Your GetMessage usage/definition here

#pragma pop_macro("GetMessage")

我怀疑这是MS特有的功能,所以请记住这一点。

答案 1 :(得分:6)

(GetMessage)(...)

GetMessage on MSDN

答案 2 :(得分:4)

Jus一些有用的信息,您也可以使用#pragma push_macro / pop_macro来推送和弹出宏定义。如果要覆盖代码块中的宏定义,这非常有用:

#pragma push_macro("GetMessage")
#undef GetMessage

// Your GetMessage usage/definition here

#pragma pop_macro("GetMessage")

我怀疑这是MS特有的功能,所以请记住这一点。

答案 3 :(得分:1)

是否存在调用GetMessage和Window的GetMessage的代码?

此类代码无法区分这两者。您将无法在同一文件中同时调用它们。

如果您在一个文件中使用一个函数而在另一个文件中使用另一个函数,只需在一个文件中执行建议的#undef。

答案 4 :(得分:0)

鉴于您的评论中列出的约束,您可以执行此操作的唯一方法是:

#undef GetMessage

在调用API的GetMessage之前。 (并且假设在源文件中此点之后没有人调用Win32 GetMessage。)