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

Is there a way to workaround a #define introduced by a vendor?

本文关键字:#define 供应商 解决 有没有      更新时间:2023-10-16

因此,我们使用的供应商提供了一个库(主要用于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/,因此我猜也无法控制包含顺序......

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

#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),并且它们在其余代码中保留其预期含义。

如果没有看到文件中的其他内容,很难找到一个 100% 有效的解决方案。

但是,您可以尝试的一个想法如下(注意 - 我已经在我的编译器中模糊地尝试过这个,但我不保证它会在任何其他编译器中工作)。

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

typedef s_int64 int64_t;
...

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

然后,同样在命令行上,您可以为自己定义该映射:

-Dint64_t=int64_t

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

#define int64_t int64_t

结果是,从理论上讲,#defines不会干扰任何其他代码(他们不应该做任何事情 - 我不确定你最终是否会得到递归扩展? 当您创建了正确类型的typedef时,供应商代码应该仍然有效。

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

然后,您应该要求供应商更新其代码以使用typedef。 您是客户,他们想向您出售产品。

所有理论头脑。

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

只需先用您的值定义它:

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