有没有办法解决供应商引入的#define?

时间:2013-10-15 09:28:59

标签: c++ c c++11

因此,我们使用的供应商提供了一个库(主要用于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 <iostream>

#include <vendor/library.h>

int main(void)
{
  std::int32_t std_i = 0;
  return std_i;
}

立即出现编译错误,(s_int32不在std::)。所以问题是,除了唠叨供应商这个解决方案之外,还有什么方法可以在我们的代码中解决这个问题? (顺便说一句。我尝试过的事情,#include <cstdint> 之前他们的标题,没有运气; extern "C"包装,没有运气。标题安装在/usr/include/所以没有控制包含顺序我猜也是......)

4 个答案:

答案 0 :(得分:21)

您可以取消定义他们的定义。

#undef int64_t
#undef int32_t
#undef int16_t
#undef int8_t

答案 1 :(得分:5)

预处理器有一个聪明的属性:阻止替换宏时的递归!因此,您可以这样定义它们:

#define int64_t int64_t
#define int32_t int32_t
#define int16_t int16_t
#define int8_t int8_t
在之前

包括供应商的标题。这样他们就不会被重新定义(因为他们正在使用#ifndef)并且他们保留了其余代码的预期含义。

答案 2 :(得分:4)

如果没有看到文件中的其他内容,找到一个可以100%工作的解决方案真的很棘手。

然而,您可以尝试的一个想法是以下(注意 - 我已经在我的编译器中尝试了这种迷惑,但我不保证它可以在任何其他的工作中使用。)

创建一个包含其定义的文件,但是为typedef:

typedef s_int64 int64_t;
...

然后,一些编译器允许您在命令行上指定要包含在其他任何文件之前的文件...例如,gcc具有-include开关,因此您指定包含此文件。

然后,也可以在命令行上创建映射到自己的定义:

-Dint64_t=int64_t

甚至将定义放在上面的文件中:

#define int64_t int64_t

理论上,结果是#defines不会干扰任何其他代码(他们不应该做任何事情 - 因为'我不确定你是否可以结束递归扩展?)。当您创建了typedef到正确的类型时,供应商代码仍然有用。

将typedef放入强制包含的文件中的原因是,您希望确保将其包含在其他任何内容之前。

然后你应该让供应商更新他们的代码以使用typedef。您是客户,他们想向您推销产品。

所有的理论思想。

答案 3 :(得分:0)

他们正在使用#ifndef宏,这意味着:如果没有定义,则值为......

首先使用您的值定义它:

#define int64_t (xx)
#define int32_t (xx)
#define int16_t (xx)
#define int8_t  (xx)