c++ - 如何从 C-Header 导入 "disable"宏

标签 c++ c c-preprocessor

A 类使用一个用 C 编写的库。该库提供了一些在 A 中使用的数据类型和常量。不幸的是,该库还在其头文件中定义了宏,这些宏与我在 main.cpp 或其他使用 A 的类中的 C++ 代码发生冲突。

当 A.h 包含在某处时,如何防止 c_library.h 的宏被执行?我也愿意接受架构更改,但我不想接触 C 库。

当然,还有#undef 指令。但这意味着每个宏或每次碰撞都需要大量手动工作。 (好吧,没有太多 - 但是,嘿,这一定可能更优雅?)

代码:

//main.cpp

#include "A.h"

...
A a(...)
...
std::max(x, y); // oops, problem since max is defined as macro in c_library.h
...

//A.h
#include "c_library.h"

class A{
public:
    A(...);
    static void callbackForCLibrary(datatypeOfCLibrary d){...}
private:
    private datatypeOfCLibrary1;
    private datatypeOfCLibrary2;
}

最佳答案

您已经知道 #undef 选项,它可以满足您的需要。

但是,还有另一种选择。您可以对用户完全隐藏 A 使用库 C 的事实:在 A 的 header 和类定义中定义您自己的类型和接口(interface)> 并从 A header 中删除包含的库。然后在您的实现文件中,您可以包含库头并以任何需要的方式使用该库,同时向您的用户隐藏 c_library.h 的包含。这具有减少类用户、类和它所依赖的库之间的耦合的额外优势。

关于c++ - 如何从 C-Header 导入 "disable"宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25046500/

相关文章:

c++ - 使用 CRT 库查找特定的内存泄漏

c++ - 获取考虑 DST 的时差

c - 使用 objdump 查看时,GCC 调试选项不考虑预处理器 #if

c - 定义#define宏

c++ - 使用 tbb 并行化视频转换程序

C++ 标准算法将一个表达式分成由最低优先级运算符分隔的 2 个表达式?

C语言while后do使用

使用 malloc 创建动态结构数组

c - sprintf 自行截断输出字符串

c - 停止 bool 的宏扩展