2012-01-06 10 views
0

私はC-ライブラリにC-環境にbool値を返す

int (*fptr)(void); 

を関数ポインタを持っていると私は、私は次の操作を行うことができ、それが安全になりますC++

class A { static int func(); } 

でクラスを持っていると言いますA::func()boolを返すようにするために、任意のプラットフォーム

ftpr = A::func; 

に私はしたいと思います。

class A { static bool func(); } 

と私は

fptr = reinterpret_cast<int(*)()>(A::func); 

をキャスト気にしない。しかし、それは、任意のプラットフォーム上で安全になりますか?一見したところ(それはsizeof(bool) <= sizeof(int)のように)、私はそれほど確かではありません。

+0

注:http:// reinterpret_castからタイプを入力してください。 – zzz777

+0

FYI:コードを4つのスペースでインデントして、コードとしてフォーマットすることができます。 –

答えて

4

いいえ、関数ポインタのキャストは安全ではありません。間違った型の関数ポインタを介して関数を呼び出すと、未定義の動作が発生します。

CコードをCコードと相互運用する必要がある場合は、インターフェイスにC++ boolタイプ(またはC言語にはない他のC++タイプ)を使用しないでください。

+0

決定的な答えをありがとう:私はクライアントコードに戻り値としてintをプッシュするか、軽量のC++ラッパーを作成します。 – zzz777

+0

また、Cから呼び出された関数が正しい呼び出し規約を持っていることを確認してください。ポインターを呼び出しても、関数はextern "C"(typedefも)として宣言されなければなりません。静的メンバーを含むメンバーは、extern "C"にすることはできません。 –

+0

@dietmarあなたはあなたの意見を具体化できますか?私の理解では、extern "C"はネームマングリング以外の効果はありません(私は第三者図書館を使用していません)。問題のコード(boht cとC++)の全部が、同じコンパイラによって – zzz777

関連する問題