【问题标题】:How to disable MFC macros that change function names for Unicode or ASCII如何禁用更改 Unicode 或 ASCII 函数名称的 MFC 宏
【发布时间】:2013-12-06 12:04:12
【问题描述】:

MFC 有定义如

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

但是我正在使用一个也有 DrawText() 函数的库,我猜 MFC 也定义了更改,并且我在这个调用中遇到了链接器错误,因为显然该库没有名为 DrawTextW(...) 的函数

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

【问题讨论】:

    标签: c++ visual-c++ unicode mfc static-libraries


    【解决方案1】:

    一个简单的预处理器黑客应该可以完成这项工作。但是你应该小心限制你使用它的地方,因为它可能会弄乱 MFC。因此,您应该将使用限制在您需要访问该库的地方。

    #ifdef DrawText
    #undef DrawText
    #endif
    

    【讨论】:

    • 这导致error C2039: 'DrawText' : is not a member of 'PoDoFo::PdfPainter'。比我想的也许我应该取消定义它并再次将其定义为 #define DrawText DrawText 但我也遇到了同样的错误。
    • 这会很烦人,你需要为调用另一个库JUST取消它,然后正确地重新定义它
    • 在包含 MFC 标头之后,但在包含 PoFoDo 库标头之前,您必须取消定义它。否则,在处理库头文件时,编译器将错误地看到 class PoDoFo::PdfPainter 具有 DrawTextW() 成员函数而不是 DrawText() 成员函数。
    • 对于投反对票的人...请发表理由,这是对问题的完全有效的答案。
    • -1 你在自相矛盾。即使您声明应该限制 “preprocessor hack” 的范围,但您实际上并未提供任何内容。您在 cmets 中进一步更正了您提出的解决方案,声明您必须“正确地重新定义它[宏]”,但同样,没有提供任何实际实现的内容。总的来说,这是一种糟糕的方法,将全局解决方案应用于本地问题。
    【解决方案2】:

    这不是 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 指令包装在 push/undef/pop 序列中:

    #pragma push_macro("DrawText")
    #undef DrawText
    
    #include "my_header.h"
    
    #pragma pop_macro("DrawText")
    

    【讨论】:

      猜你喜欢
      • 2010-12-21
      • 2015-04-28
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 2022-06-23
      • 2015-08-09
      • 1970-01-01
      相关资源
      最近更新 更多