5

GNATコンパイラを使用して、次のファイルでセマンティックをコンパイルまたはチェックしようとすると、エラーのバリエーションが発生しますpackage "Foo" does not allow a body。私はこの言語に不慣れで、この一見基本的な問題に対する答えをインターネット上のどこにも見つけることができません。お知らせ下さい。

foo.ads

package Foo is
   type Shape_Enum is (Circle, Triangle, Rectangle);
end Foo;

foo.adb

package body Foo is
   procedure Foo is
      MyShape : Shape_Enum;
   begin
      MyShape := Rectangle;
   end Foo;   
end Foo;
4

3 に答える 3

10

仕様に本体を必要とするものが含まれている場合にのみ、パッケージに本体を含めることができます。(これにより、オプションのボディが誤ってビルドから除外される可能性がある問題を回避できます。)

パッケージの本文(Foo.Foo)にプロシージャがありますが、それを呼び出す方法はありません。

宣言を追加する場合:

procedure Foo;

仕様に従って、(a)エラーを修正し、(b)パッケージのクライアントがプロシージャを呼び出すことを許可する必要があります。またはpragma Elaborate_Body;、プロシージャをクライアントに表示したくない場合は、本体を要求するために使用できます。

ちなみに、それを含むパッケージと同じ名前のプロシージャについては特別なことは何もありません(C ++の場合とは異なり、このような関数はそれを含むクラスのコンストラクタです)。別の名前を使用する方がおそらくより明確でしょう。

Adaリファレンスマニュアルのセクション7.2を参照してください(私は2012年規格の最近のドラフトを使用しています)。

package_bodyは、前のpackage_declarationまたはgeneric_package_declarationの完了である必要があります。ライブラリpackage_declarationまたはライブラリgeneric_package_declarationは、本体を必要としない限り、本体を持たないものとします。pragma Elaborate_Bodyそれ以外の場合は本体を必要としない場合は、library_unit_declarationに本体(10.2.1を参照)を要求するために使用できます。

于 2012-09-27T22:16:17.307 に答える
3

次を追加して、関数をプライベートとして宣言することもできます。

private
    procedure Foo;

仕様に。これにより、パッケージ外での使用が防止されます。

于 2012-09-29T02:24:57.410 に答える
1

どうやらAdaは、パッケージ本体を明示的に強制する必要がありますpragma elaborate_body。私はここで答えを見つけました:

http://objectmix.com/ada/338459-erreur-de-compilation.html#post1225079(私がフランス語を話す神に感謝します):

オリジナル

entier_paquetage.adb:4:01:このパッケージの仕様では本体が許可されていません

Si la spec ne requeste pas un corps、lecorpsn'estpasautorisé。peut forcer un corps en mettant "pragma elaborate_body;" danslaspec。

英語

仕様がボディを要求しない(または要求しない)場合、ボディは承認されません。「pragmaelaborate_body;」を置くことで、体を強制することができます。

于 2012-09-27T22:39:36.050 に答える