2017-11-12 7 views
0

このquestionにあるものと同様の問題があります。Adaのモジュラータイプバインドで使用されたC定数

私はAdaでC定数をモジュラー型の範囲aとして使用します。

残念ながら、私はエラーを取得する:

linux-char_device.ads:52:27: non-static expression used for modular type bound 
linux-char_device.ads:52:27: "MAJOR_NUM" is not a static constant (RM 4.9(5)) 

Cコードは次のとおりです。

const unsigned major_num = 7; 

エイダ・コードは次のとおりです。

​​
+0

@RuudHeldermanごめんなさい、コードの間違った部分をコピーしました。 'const unsigned major = 7; 'でも' ' – Artium

+0

編集していただきありがとうございます。 Adaのように思えます。誰かが素晴らしいアイデアを持っていない限り、あなたは「範囲」に落ちるかもしれません。それはオプションだろうか? –

+0

Major_Typeにはどのモジュラータイプの機能が必要ですか? –

答えて

2

コンパイル時定数は通常、直接に使用されていますアセンブラコードが生成され、gccの任意の言語からインポートまたはエクスポートすることはできません。それはあなたのCコードは本当に、おそらくあなたは-O0を使用しない限り、あなたは文句を言わない、結果のオブジェクトファイルにmajor_num見つける

const unsigned major_num = 7;

が含まれている場合、です。検査するオブジェクトファイル(CまたはAdaの場合は問題ありません)でnmを実行してみてください。

したがって、Adaでコンパイル時定数をインポートすることはできません。

MAJOR_NUM : constant Interfaces.C.unsigned := 7;

最も簡単な方法は、Cにgccのスイッチ-fdump-ada-specを使用することです:あなたはエイダは、いくつかのC(またはC++)のための結合関数を作成したい場合は、エイダの定数としてC定数を再宣言する必要がありますヘッダ。 Generating Ada Bindings for C and C++ headers

+1

ところで、ラップアラウンドセマンティクスとモジュラスが** 7 **のモジュラー型が本当にありますか?最初はC言語では存在しません。 – RREE

+0

@REE、ありがとう。あなたが書いたことは、私が経験したことではありません。インタフェース定数は、モジュール型のサイズを定義するのに使用されない限り正常に動作します。ナンバー7はほんの一例に過ぎません(私はそれが貧しいことに同意します)。最終的に私は 'mod 'を使うという考えを放棄した。 – Artium

関連する問題