【问题标题】:#define Conflicting with Conditionally #include-d Library#define 与有条件的 #include-d 库冲突
【发布时间】: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++


【解决方案1】:

如果您的编译器支持push_macropop_macro pragma,您可以像这样使用它们:

#include <library_b/library_b_header.hpp>

#pragma push_macro("uint16")
#undef uint16
#include <library_c/library_c_header.hpp>
#pragma pop_macro("uint16")

(这些 pragma 是非标准的,但得到广泛支持。Visual C++、gcc、clang 和英特尔 C++ 编译器都支持它们。)

是的,您需要在包含库 C 中定义此宏的标头的任何地方执行此操作,但这通常可以通过编写自己的标头来简化,该标头包含库 C 标头,然后在库 C 所在的任何位置包含该标头在您的项目中需要。

【讨论】:

  • 在 MSVC 和 g++ 上工作对我来说已经足够了。 +1 教我push_macro/pop_macro。接受解决问题。谢谢!
猜你喜欢
  • 2010-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多