如何告诉预处理器不要替换特定的宏?防止C预处理器执行特定的宏替换
具体问题如下:Windows头文件定义了GetMessage宏。
我的C++头文件与我的API有一个GetMessage方法。我不想重命名我的方法。但是,在Windows上使用API时,包括windows.h会将GetMessage方法调用替换为GetMessageA。
如何告诉预处理器不要替换特定的宏?防止C预处理器执行特定的宏替换
具体问题如下:Windows头文件定义了GetMessage宏。
我的C++头文件与我的API有一个GetMessage方法。我不想重命名我的方法。但是,在Windows上使用API时,包括windows.h会将GetMessage方法调用替换为GetMessageA。
你尝试只是在做一个
#undef GetMessage
甚至
#ifdef GetMessage #undef GetMessage #endif
,然后调用Windows GetMessageA或GetMessageW直接以适用者为准。
,如果你正在使用wchar_t8的char *,你应该知道..
(感谢don.neufeld)
布莱恩也说 物权法一些有用的信息,你也可以使用#pragma push_macro/pop_macro推送和弹出宏定义。如果你想覆盖的代码块中的宏定义这是伟大的:
#pragma push_macro("GetMessage")
#undef GetMessage
// Your GetMessage usage/definition here
#pragma pop_macro("GetMessage")
我怀疑这是一个MS特定的功能的,所以记住这一点。
但是我不能再使用Windows的GetMessage – 2008-11-14 22:20:31
是的,你可以直接调用GetMessageA或GetMessageW,无论哪个都适合。 – 2008-11-14 22:37:41
是否有调用GetMessage和Window的GetMessage的代码?
这样的代码将无法区分它们中的两个。您将无法在同一个文件中调用两者。
如果在一个文件中使用一个函数,而在另一个文件中使用另一个函数,只需在一个文件中执行建议的#undef。
鉴于在您的评论概括你的限制,你可以做到这一点的唯一方法是做一个:
#undef GetMessage
正确调用你的API的前GetMessage函数。 (这这点在源文件中被调用Win32的GetMessage后假设没有人。)
(GetMessage)(...)
物权法一些有用的信息,你也可以使用#pragma push_macro/pop_macro推和流行宏定义。如果你想覆盖的代码块中的宏定义这是伟大的:
#pragma push_macro("GetMessage")
#undef GetMessage
// Your GetMessage usage/definition here
#pragma pop_macro("GetMessage")
我怀疑这是一个MS特定的功能的,所以记住这一点。
只是在执行#undef GetMessage并不好,因为使用该API的代码也使用Windows GetMessage。 – 2008-11-14 22:15:43
啊,Windows SDK的另一个例子是不加区分地使用宏来打破所有命名空间(而不仅仅是C++的命名空间特性)。 – 2008-11-14 23:18:59
@vincent:see don。newfeld在ShoeLace的`#undef GetMessage`中的评论回答 – 2008-11-14 23:44:18