这是一个简化的例子。假设我正在使用库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
这显然不起作用,但也许它表达了我的意图。还有什么我可以尝试的吗?
答案 0 :(得分:3)
如果您的编译器支持push_macro
和pop_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的任何位置包含该头。在你的项目中需要。