簡體   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