繁体   English   中英

具有布尔返回值的功能,仅设置整个寄存器的1个字节

[英]Function with bool return value, only set 1 byte of the entire register

我有以下一段代码是api(cdecl)的一部分。 在MSVC ++中,bool的大小为1个字节,但是由于bool是由实现定义的,因此其他编译器/作者不正确定义函数签名的某些程序可能会将bool视为> 1字节,因此调用下面的检查可能会在程序一侧返回true。

virtual bool isValid()
{
    return false;
    // ^ code above in asm: xor al, al
}

为了避免这种情况,我在返回之前放置了一个内联asm, xor eax, eax但我觉得它有点hacky,并且由于缺乏内联汇编程序支持,因此它当然不能在x64上运行。

使用#define bool int可以工作,但不是我想要的,因为我的结构内部具有bool数据类型,使用它会导致损坏。

是否有诸如内在函数之类的东西可以将eax / rax寄存器清零,或者什么可以解决此问题?

没有什么可以满足您的要求。 您的问题需要完全不同的解决方案。

首先,任何“错误定义函数签名”的代码都需要修复。 在其他代码中解决它从来都不是解决方案。

接下来,您的问题不只是实现实现定义bool ,C ++标准还使很多事情都实现实现定义。 如此之多,以至于两个不同的C ++编译器很少具有兼容的ABI。 如果您的代码提供了C ++接口供其他人使用的编译代码使用,则可能需要为要支持的每个不同的编译器生成单独编译的二进制文件,无论是目标文件,静态库,DLL还是可执行文件的形式。 实际上,您可能需要为每个编译器的每个版本提供单独的二进制文件。

有两种C ++编译器试图与Microsoft C ++ ABI兼容。 第一个是Intel的C ++编译器 ,第二个是clang的Windows端口 clang的实现显然仍在进行中。 您可能仍需要为编译代码所使用的每个版本的Microsoft C / C ++运行时库创建单独的版本。

通过为代码提供纯C接口,可以潜在地减少需要分发的不同版本的二进制文件的数量。 纯C接口意味着仅使用C数据类型和仅声明为extern "C"函数。 虽然类,成员函数,模板,RTTI和异常之类的东西可以在实现中使用,但不能用作公共接口的一部分。 类似于COM的接口是一个例外,类仅具有公共纯虚函数。 由于Windows的C编译器基本上都使用相同的C ABI并支持COM接口,因此不太可能出现兼容性问题。 但是, bool类型(实际上是C中的_Bool类型)可能不安全使用,因为它是C语言中相对较新的功能。 请在您的C接口中使用int

请注意,由于C / C ++运行时的差异,即使您要分发与Microsoft Visual C ++编译器一起使用的已编译二进制文件,您仍可能需要为每个版本的编译器都分发版本。 这是因为每个版本都有不同的运行时实现,并且它们的数据结构具有不兼容的内部布局。 您不能将在由Visual C ++一个版本编译的函数中创建的STL容器传递给使用其他版本编译的函数。 如果可执行文件和DLL使用不同版本的C运行时,则无法在可执行文件中使用malloc分配内存并将其free在DLL中。

不幸的是,除非您愿意将用户限制在一个特定的编译器上,否则您所寻找问题的简单解决方案可能不存在。 请注意,这是提供插件支持的程序使用的常见解决方案。 Pugin文件需要与编译可执行文件的版本相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM