有没有办法解决供应商引入的 #define
Is there a way to workaround a #define introduced by a vendor?
因此,我们使用的供应商提供了一个库(主要用于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)
- 与C代码相比,为什么C++代码不需要"#define _POSIX_C_SOURCE 200809L"?
- 以下 C++ 代码用于 -> "#define idiv(a, b) (((a) + (b) / 2) / (b))" 是什么?
- 如何以静态代码分析友好的方式使用 #define 防护?
- C++相当于整数的 #define
- #define Dbg(fmt,..) (0) 是什么意思? 警告:表达式无效
- 在C++中使用变量而不是"#define"来指定数组大小是不是一种糟糕的做法?(C错误:在文件范围内
- 我们可以用 C 语言嵌套 #define 和 #if 吗?
- 如何将旧的 C 样式 #define 映射与现代C++进行调整?
- 找不到 #define 的函数定义
- "#define X X"是什么意思?
- 使用 constexpr 替换 #define 和 #ifdef 进行条件编译
- 野牛/flex:计算器将双精度值解释为整数,所以我添加了 YYSTYPE 双精度 #define 但我有多个编译错误
- 如何解决C++中声纳库贝静态代码分析错误"Explicitly define the missing copy constructor, move constructor .."
- c中 #define 的不足
- 使用 [#define & #ifdef] 跨文件激活代码块
- 如何避免#define语法的变量重新声明
- 使用 GCC 对 C 文件进行部分预处理(不删除 "define" 指令)
- 使用 #define 声明函数
- #define 宏中的括号失败
- 有没有办法解决供应商引入的 #define