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

Nim*_*Nim 4 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
Run Code Online (Sandbox Code Playgroud)

在他们的图书馆深处的一个标题中.现在的问题是,一旦他们的库被包含在简单的C++ 11代码中,例如:

#include <iostream>

#include <vendor/library.h>

int main(void)
{
  std::int32_t std_i = 0;
  return std_i;
}
Run Code Online (Sandbox Code Playgroud)

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

Iva*_*nko 21

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

#undef int64_t
#undef int32_t
#undef int16_t
#undef int8_t
Run Code Online (Sandbox Code Playgroud)

  • @EliasVanOotegem:有人可能认为命名积分常量的宏也不是很好,你可以/应该使用枚举.宏就像是对魔法的信仰,你用它来处理任何你不能(还)正确处理的事情;-) (3认同)
  • 您可以通过创建自己的头文件来缓解undef痛苦:`myVendor.h`看起来像:`#include"vendor.h"#undef int64_t #undef int32_t等... (3认同)
  • @Elias:这些肯定不是很好,这就是提问者遇到问题的原因. (2认同)

Dan*_*rey 5

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

#define int64_t int64_t
#define int32_t int32_t
#define int16_t int16_t
#define int8_t int8_t
Run Code Online (Sandbox Code Playgroud)

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