如何禁用改变Unicode或ASCII函数名称的MFC宏

5

MFC有定义,如下:

#ifdef UNICODE
#define DrawText  DrawTextW
#else
#define DrawText  DrawTextA
#endif // !UNICODE

然而,我正在使用一个库,该库也具有DrawText()函数,我猜测MFC也定义了更改,并且我因为显然该库没有名为DrawTextW(...)的函数而收到了此调用的链接器错误。

我如何使库函数在我的MFC应用程序中正常工作?

2个回答

5

这不是MFC,而是Windows API。解决宏遮蔽其他符号的推荐方法是暂时禁用该宏:

// Temporarily undefine the DrawText macro
#pragma push_macro("DrawText")
#undef DrawText

// Call your version of DrawText
DrawText( ... );

// Re-enable the macro
#pragma pop_macro("DrawText")

#pragma push_macropop_macro是必须的,以避免破坏Windows SDK头文件。

对于您的类的头文件和实现文件,应该采用相同的方案。如果您无法更改此类的头文件,则需要将#include指令包装在推送/未定义/弹出序列中:

#pragma push_macro("DrawText")
#undef DrawText

#include "my_header.h"

#pragma pop_macro("DrawText")

1
一个简单的预处理器 hack 应该可以完成这项工作。但是你需要小心地限制它的使用范围,因为它可能会搞乱 MFC。所以你应该将其使用限制在需要访问该库的地方。
#ifdef DrawText
#undef DrawText
#endif

这导致了error C2039: 'DrawText' : is not a member of 'PoDoFo::PdfPainter'的错误。我想也许我应该将其取消定义,然后重新定义为自身,如#define DrawText DrawText,但是这样仍然会出现相同的错误。 - zar
这可能会相当烦人,你需要将其取消定义,仅仅为了调用其他库,然后再正确地重新定义它。 - Mgetz
3
在包含MFC头文件之前,您需要取消定义它,但在包含“PoFoDo”库头文件之前。否则,在处理库头文件时,编译器将错误地看到“class PoDoFo :: PdfPainter”具有“DrawTextW()”成员函数,而不是“DrawText()”成员函数。 - Michael Burr
这个问题被标记为[visual-c++]。编译器特定的解决方案不应该让人感到意外。这个问题也被标记为[mfc],这意味着MSC。另一方面,如果您知道一种重新启用宏的方法,而不依赖于编译器特定的实现,请不要犹豫更新您的答案。请确保将宏重新启用为它原本持有的真实值,而不是您认为它应该具有的值。祝你好运找到一个与编译器无关的实现方式。 - IInspectable
@IInspectable,我并不否认目前跨平台(甚至在同一平台上)的C++状态相当糟糕。这并不意味着我的答案不正确,尽管总体而言你的更好(并且投票也反映了这一点)。 - Mgetz
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接