【发布时间】:2014-09-19 13:22:30
【问题描述】:
这是一个简化的示例。假设我正在使用库 B 和 C 编写程序 A。Niether 库的源代码可以更改,它们是唯一可用的库。库 B 有一个合理的 #define,而库 C 有一个 stupid #define 给它起别名。比如说:
//library_b_header.hpp
#pragma once
#define uint16 unsigned short
//...
//library_c_header.hpp
#pragma once
#define uint16 unsigned char
我的大多数先例都是像this 这样的问题。一个答案很有帮助,涵盖了我看到的一系列建议(释义):
- 在您自己的代码中添加
#undef - 不要直接包含
library_c_header.hpp。如果另一个库为您包含它,请不要直接包含 that。相反,将其包含在单独的.cpp文件中,然后可以在其标头中公开包装函数。 - 重命名您自己的符号。
第二个选项接近我的正常解决方案,但库 C 很大;我不可能包装所有的功能。即使我可以,也很有可能搞砸,而且它肯定不能移植到库 C 的新版本(也很常见)。
第三个选项不起作用,因为它无处不在。与之冲突的不仅仅是 me;它与字面上的其他一切相冲突。我想它可以完成。 . .这只是一个道德上的错误#define,它应该死!
这里的第一个选项最接近我的尝试。第二个问题是#includeing 库 C 依赖于库 B 中定义的令牌。
我得到的最远的是:
#include <library_b/library_b_header.hpp>
#define library_b_uint16 uint16
#undef uint16
#ifdef LIBRARY_B_SYMBOL
#include <library_c/library_c_header.hpp>
#undef uint16
#define uint16 library_b_uint16
#endif
这显然行不通,但也许它表达了我的意图。还有什么我可以尝试的吗?
【问题讨论】:
-
我有点困惑 - 库 C 依赖于库 B 但也与库 B 冲突?
-
@MichaelBurr 库是不相关的,但是正在编写的程序只能包含 C 如果在 B 中定义了符号。参见示例。
标签: c++