私は以下のコードをapi(cdecl)の一部として持っています。 MSVC++では、sizeof boolは1バイトですが、boolは実装が定義されているため、他のコンパイラでコンパイルされたプログラム/関数の作成者が誤って関数のシグネチャを定義すると、boolが> 1バイトとして扱われる可能性があります。boolの戻り値を持つ関数は、レジスタ全体の1バイトのみを設定します。
virtual bool isValid()
{
return false;
//^code above in asm: xor al, al
}
はこれを避けるために、私が戻る前に、インラインアセンブラ、xor eax, eax
を置く - 私はそれは少しハック感じ、それはもちろんにより、インラインアセンブラのサポートの欠如にx64の上では動作しません。
#define bool int
を使用すると、うまくいかない場合があります。その中にboolデータ型を持つ構造体があり、これを使用すると破損が発生します。
eax/raxレジスタをゼロにすることができる組み込み関数など、この問題を解決できるものはありますか?
異なるコンパイラによって生成された2つのライブラリは、実装定義の機能を使用して通信しようとします。あなたはこの写真に間違ったことを見ますか? – dasblinkenlight
これは驚くかもしれませんが、ほとんどの基本的な型のサイズは実装定義です。 'int'はこれに関して' bool'と変わりありません。 – SergeyA
msvC++のみであるはずですが、プラグインのサポートを追加するとどうなるか分かります。特定のプログラムはx86上で4バイトのシグネチャを使用しているので、この場合は 'int'が動作するはずです。 –