有没有办法解决供应商引入的#define?
因此,我们使用的供应商提供了一个库(主要用于C,具有一些C ++支持),它执行以下操作:
#ifndef int64_t #define int64_t s_int64 #endif #ifndef int32_t #define int32_t s_int32 #endif #ifndef int16_t #define int16_t s_int16 #endif #ifndef int8_t #define int8_t s_int8 #endif
在他们的图书馆深处的一个标题中。 现在的问题是,一旦他们的库包含在简单的C ++ 11代码中,例如:
#include #include int main(void) { std::int32_t std_i = 0; return std_i; }
立即出现编译器错误( s_int32
不在std::
)。 所以问题是,除了唠叨供应商这个解决方案之外,还有在我们的代码中解决这个问题吗? (顺便说一句。我尝试的东西, #include
在它们的标题之前 ,没有运气; extern "C"
包装,没有运气。标题安装在/usr/include/
所以无法控制包含的顺序我猜好…)
没有看到文件中的其他内容,找到一个可以100%工作的解决方案是很棘手的。
但是,您可以尝试的一个想法是以下(注意 – 我已经在我的编译器中尝试了这种迷惑,但我不保证它可以在任何其他工作中使用)。
创建一个包含其定义的文件,但是作为typedef:
typedef s_int64 int64_t; ...
然后,一些编译器允许您在命令行上指定要包含在其他任何文件之前的文件…例如,gcc具有-include
开关,因此您指定包含此文件。
然后,也可以在命令行上创建映射到自己的定义:
-Dint64_t=int64_t
甚至将定义放在上面的文件中:
#define int64_t int64_t
结果是,理论上,# #defines
不会干扰任何其他代码(他们不应该做任何事情 – 因为’我不确定你是否最终会进行递归扩展?)。 当您创建了一个类型正确的typedef
,供应商代码仍然有效。
将typedef放入强制包含的文件中的原因是,您希望确保在其他任何内容之前包含它。
然后你应该让供应商更新他们的代码以使用typedef
。 你是客户,他们想卖给你一个产品。
所有的理论头脑。
您可以取消定义他们的定义。
#undef int64_t #undef int32_t #undef int16_t #undef int8_t
预处理器有一个聪明的属性:阻止替换宏时的递归! 因此,您可以这样定义它们:
#define int64_t int64_t #define int32_t int32_t #define int16_t int16_t #define int8_t int8_t
在包括供应商的标题之前。 这样它们就不会被重新定义(因为它们使用#ifndef
)并且它们保留了其余代码的预期含义。
他们正在使用#ifndef
宏,这意味着: 如果没有定义,则值为……
只需先用您的值定义它:
#define int64_t (xx) #define int32_t (xx) #define int16_t (xx) #define int8_t (xx)