2011-11-03 9 views
7

私は、Adaにモジュールを持ち、渡すパラメータ(スカラー値)と構造を通信するC++の多くのモジュールを持つアプリケーションで使用する通信ミドルウェアを設計しています。アプリケーションはMS Windows XPとWindows 7で動作し、C++パートはMSVC++ 2008で開発され、AdaパートはGPS/GNATを使用して開発されています。 Adaのバージョンは1995年ですが、新しいAda仕様を使用する可能性のあるコンパイラの移行(新しいバージョンのGPS/GNAT)の途中です。Adaバリアントレコードは、C++共用体とバイナリ互換性がありますか?

ミドルウェアはC++で書かれており、モジュール間で渡されるすべての型を含む共用体型を使用したいので、システム上で使用される各型に対して1つのput/get関数を指定する必要はありません。

質問は、C++のユニオンはAdaのバリアントレコードとバイナリ互換ですか?言い換えれば、C++の共用体をAdaコードに渡すと、Variantレコードとして読み取ることができますか? (またはその逆)

私はこれを可能にするために、いくつかの調整が必要になると思い...

+1

おそらくプラットフォーム、コンパイラなどを指定しなければならないでしょう。 –

+0

ありがとう、私たちの環境に関する情報 – Guarita

答えて

2
(例:C++組合はエイダバリアントレコードがない間にその内容を説明するメンバーが含まれていません)

いいえ、あなた自身が述べているように、Adaのバリアントレコードにはタグフィールドが含まれています。 C組合はそれを持っていません。 (少なくともMSVC++とGCCではなく、ISO Cで許可されています)

+0

Ahmさん、はい、私の質問は、CのユニオンをAdaのバリアントと互換性を持たせ、プラグアンドプレイではないいくつかの追加作業で可能にすることができるかどうかということです。私はすでに、C言語の部分をAdaコードにバイナリ・トークするようにするのにはいくつかの問題があると予想しています。 – Guarita

7

おそらく。

Ada 2005は、プログラムが与えられた識別された型と一部のC共用体の間のインタフェースの対応を "[指定]できるようにするプラグマを提供します。判別式(類)

私はRMセクションを読んでから、バリアントレコードを定義するのに必要な判別式を持つAdaタイプを宣言しますが、判別式には記憶スペースは割り当てられません。私はこれを、Ada側で、判別式を後で参照することはできないことを意味します。 (他の制限もありますが、すべてのフィールドはC互換でなければなりません。RM B.3.3を参照してください)

私はこのプラグマを使用したことは一度もありません。あなたのシステムで(うまくいけば)動作させるための実験。がんばろう!

+2

実験のいくつかは、あなたがGNATにMSVC++の予想通りにレコードを置くように指示する必要があるかどうかを調べることです。 GNATはもちろんGCCの規則を理解しています。あなたがCの組合や簡単な型に自分自身を制限する限り、あまりにも悪くはありません。 –

+1

Windows上のGCCはプラットフォームC ABIに準拠しているため、Windows上のGNATはABIとMSVC++との互換性が必要です。 – MSalters

3

上記のMSalterが何らかの理由でCのunionにvariantを指定するフィールドが含まれていない限り、動作しません。これはC言語では必須ではないため、しばしば動作しません。しかし、以来、はそのCタイプの実装を制御しているので、動作させることができます。どのユニオンが使用されているかを指定するユニオンの直前にフィールドを置いてください。

C言語の構造体と完全にバイナリ互換性を持たせるには、単純なAdaレコード型とレコード表現節を使って、同じ場所にフィールドが配置されていることを確認する必要がありますあなたのCコンパイラがそれらを配置します。そして、そうすれば、レイアウト変更を引き起こすCコンパイラの変更に脆弱になります。あなたはCコードのビットフィールドを使ってそれを防ぐことができますが、実際にはAdaのレコードのrep節ができるようにするには十分強力ではありません。これが、低レベルの作業にAdaを使用する理由の1つです。

私が最後にチェックしたとき、GnatのWindows版はVisualStudioバイナリとリンカー互換ではなかったことに言及する必要があります。これらの2つのコンパイラを一緒に動作させるための唯一の方法は、インターフェイス全体をDLLに入れることです。それ以外の場合は、GCCを使用してC++システムを構築するか、ObjectAdaのような他のAdaコンパイラを使用する必要があります。

+0

"言及されたMSalterは、Cのユニオンに何らかの理由でバリアントを指定するフィールドが含まれていない限り動作しません。たぶん私は次のような構造体でこれを行うことができます: struct foo { some_tag_typeタグ; ユニオン{​​ ... } my_union; } ?? – Guarita

+0

@guarita便利なリンクについて私の答えを見てください - 私はあなたがこのアイデアで正しい道にいると思います。 – NWS

+0

はい。 @NWSが述べたように、あなたは正しい方向に進んでいます。 –

5

はい。

AdaはC/C++ Unionsと互換性があります。その方法については、hereを参照してください(pdf)特に、ページ5は、ユニオン&タグでそれを行う方法を示しています。 Discriminantレコードを使用する場合も同じです。 (注意:あなたが使用しているコンパイラではないかもしれませんが、あなたが同じように振る舞っていないと、私は非常に驚くでしょう)

+1

私は、Ada/C/C++コンパイラがこれを重大な問題なしに処理できると期待していると少し楽観していると思いますが、問題の参考になるガイドです。 –

+0

@Marc My Optimismは、Adaコンパイラが検証されるべきであるという事実に基づいているので、同じことをすることができるはずです(均等でなくても!) – NWS

+0

私は心配しているAda側ではありません。レイアウトやリンクの細かいコンパイラの間で私に懐疑的な印象を与える(楽観主義:-))。私は拘束力があるのではなく、GNATとgccの間のデータ構造を共有することさえ気にする必要があります。 –

関連する問題