因此,我们使用的供应商提供了一个库(主要用于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)
预处理器有一个聪明的属性:阻止替换宏时的递归!因此,您可以这样定义它们:
#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),并且它们保留了其余代码的预期含义.
| 归档时间: |
|
| 查看次数: |
477 次 |
| 最近记录: |