2008-11-14 81 views
6

如何告诉预处理器不要替换特定的宏?防止C预处理器执行特定的宏替换

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

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

+0

只是在执行#undef GetMessage并不好,因为使用该API的代码也使用Windows GetMessage。 – 2008-11-14 22:15:43

+0

啊,Windows SDK的另一个例子是不加区分地使用宏来打破所有命名空间(而不仅仅是C++的命名空间特性)。 – 2008-11-14 23:18:59

+0

@vincent:see don。newfeld在ShoeLace的`#undef GetMessage`中的评论回答 – 2008-11-14 23:44:18

回答

6

你尝试只是在做一个

#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特定的功能的,所以记住这一点。

+0

但是我不能再使用Windows的GetMessage – 2008-11-14 22:20:31

+0

是的,你可以直接调用GetMessageA或GetMessageW,无论哪个都适合。 – 2008-11-14 22:37:41

1

是否有调用GetMessage和Window的GetMessage的代码?

这样的代码将无法区分它们中的两个。您将无法在同一个文件中调用两者。

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

0

鉴于在您的评论概括你的限制,你可以做到这一点的唯一方法是做一个:

#undef GetMessage 

正确调用你的API的前GetMessage函数。 (这这点在源文件中被调用Win32的GetMessage后假设没有人。)

4

物权法一些有用的信息,你也可以使用#pragma push_macro/pop_macro推和流行宏定义。如果你想覆盖的代码块中的宏定义这是伟大的:

#pragma push_macro("GetMessage") 
#undef GetMessage 

// Your GetMessage usage/definition here 

#pragma pop_macro("GetMessage") 

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