#define与条件#include-d库冲突

时间:2014-09-19 05:17:56

标签: c++

这是一个简化的例子。假设我正在使用库B和C编写程序A.可以更改Niether库的源代码,它们是唯一可用的库。库B有一个合理的#define,而库C有一个愚蠢的 #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。如果另一个库包含它,请不要直接包含那个。而是将其包含在单独的.cpp文件中,然后可以在其标题中公开包装函数。
  • 重命名您自己的符号。

第二个选项接近我的正常解决方案,但库C很大;我不可能包装所有功能。即使我可以,也很有可能搞砸了,而且它肯定不能移植到库C的新版本(这也很常见)。

第三个选项不起作用,因为它在任何地方都使用。这不仅仅是这与之相矛盾;它与字面上的其他所有内容相冲突。我想可以完成。 。 。它只是一个 GOALLY WRONG #define,它应该死!

这里的第一个选项最接近我正在尝试的选项。第二个问题是#include库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

这显然不起作用,但也许它表达了我的意图。还有什么我可以尝试的吗?

1 个答案:

答案 0 :(得分:3)

如果您的编译器支持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")

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

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