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

最佳答案

在没有看到文件中还有什么的情况下,很难找到一个 100% 有效的解决方案。

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

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

typedef s_int64 int64_t;
...

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

然后,同样在您的命令行上,您可以定义该映射到自己:
-Dint64_t=int64_t

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

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

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

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

所有的理论头脑。

关于c++ - 有没有办法解决供应商引入的#define?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19377678/

10-10 16:37