【发布时间】:2016-04-04 13:40:00
【问题描述】:
我有以下一段代码,它是 api (cdecl) 的一部分。在 MSVC++ 中 bool 的大小为 1 字节,但由于 bool 是实现定义的,因此其他编译器编译的某些程序/作者错误地定义了函数签名可能会将 bool 视为 > 1 字节,并且调用下面的检查可能会在他们的程序一侧返回 true。
virtual bool isValid()
{
return false;
// ^ code above in asm: xor al, al
}
为了避免这种情况,我在 return 之前放了一个内联 asm xor eax, eax - 但我觉得它有点笨拙,由于缺乏内联汇编器支持,它当然不能在 x64 上工作。
使用#define bool int 会起作用,但这不是我想要的,因为我的结构中包含 bool 数据类型,使用它会导致损坏。
有没有像内在函数这样可以将 eax/rax 寄存器归零或任何可以解决这个问题的东西?
【问题讨论】:
-
由不同编译器生成的两个库尝试使用实现定义的功能进行通信。你觉得这张照片有什么问题吗?
-
这可能会让您大吃一惊,但几乎所有基本类型的大小都是实现定义的。在这方面
int与bool没有什么不同。 -
应该只有msvc++,但你知道添加插件支持会发生什么。特定程序在 x86 上使用 4 字节的签名,因此在这种情况下返回
int应该可以工作。 -
如果你想在不同编译器编译的模块之间交换二进制数据,可能使用不同的 ABI,这将非常困难和痛苦,但一个好的开始是使用fixed-size integers 而不是任意大小类型。继续的一个好方法是根本不使用 C++ 功能,因为那很可能根本行不通,而是使用仅具有固定大小的 C 兼容数据类型的普通 C 接口..
-
如果这不是重复的,它值得一票,因为潜在的不兼容性有多深并不明显。
标签: c++ visual-c++ assembly