ADA文件名与包名的区别

3
我继承了一个ADA程序,其中源文件名和包文件名不遵循默认命名规范。我对ADA不太熟悉,所以可能会忽略一些简单的东西,但我在GNAT Pro用户指南中找不到相应内容。(这个类似的问题没有给我帮助。)
以下是几个示例:
File Name:    C_Comm_Config_S.Ada
Package Name: Comm_Configuration

File Name:    D_Bus_Buffers_S.Ada
Package Name: Bus_Buffers

我认为我已经解决了_S.Ada和_B.Ada,但是在程序源代码或构建文件中,我找不到包名称与其余文件名称之间的绑定关系。
当我编译一个不使用其他包的文件时,我会得到一个警告:文件名与单元名不匹配……这似乎是由于C_或D_前缀,在这种特定情况下。
此外,我不清楚C_和D_前缀在ADA上下文中是否有任何特殊含义,如果有,我想知道。
因此,我似乎有两个问题,即C_或D_前缀以及在某些情况下文件名的其余部分与包不匹配。
2个回答

6
您可以使用gnatname:请参阅用户指南
我将ACATS测试套件的子目录a/d/复制到工作目录,并创建了一个项目文件p.gpr:
project p is
   for source_dirs use ("a", "d");
end p;

并运行 gnatname 命令

gnatname -P p -d a -d d \*.ada

这导致一个编辑过的p.gpr文件和两个新文件,p_naming.gprp_source_list.txt。这些文件相当长,但看起来像这样: p.gpr
with "p_naming.gpr";

project P is

   for Source_List_File use "p_source_list.txt";
   for Source_Dirs use ("a", "d");

   package Naming renames P_Naming.Naming;

end P;

p_naming.gpr:

project P_Naming is

   for Source_Files use ();

   package Naming is
      for Body ("d4a004b") use "d4a004b.ada";
      for Body ("d4a004a") use "d4a004a.ada";
      for Body ("d4a002b") use "d4a002b.ada";
      ...
      for Body ("aa2010a_parent.boolean") use "aa2010a.ada" at 4;
      for Body ("aa2010a_parent") use "aa2010a.ada" at 3;
      for Spec ("aa2010a_parent") use "aa2010a.ada" at 2;
      for Spec ("aa2010a_typedef") use "aa2010a.ada" at 1;
      ...
      for Body ("a22006d") use "a22006d.ada";
      for Body ("a22006c") use "a22006c.ada";
      for Body ("a22006b") use "a22006b.ada”;
    end Naming;

 end P_Naming;

当源文件中有多个单元时,for Body ("aa2010a_parent") use "aa2010a.ada" at 3;被使用。

p_source_list.txt:

a22006b.ada
a22006c.ada
a22006d.ada
a27003a.ada
a29003a.ada
...
d4a002b.ada
d4a004a.ada
d4a004b.ada

例如,在构建测试d4a004b时,您必须使用文件名 和后缀

gnatmake -P p d4a004b.ada

在我移除反斜杠后,这似乎可以工作: "gnatname -P p -d src -v -v *.Ada" 谢谢。 - Jim
我认为这取决于你的shell(在我的情况下,是Mac OS X Mavericks上的bash 3.2.53)如何解释通配符。gnatname期望一个模式,因此即使当前目录中有匹配的文件,“*”也不应该被展开。用单引号或双引号括起来也应该可以。 - Simon Wright

3

Ada标准没有关于源文件命名规则的规定。由于您使用GNAT,我认为您是指“GNAT默认命名约定”。

您可以在项目文件中的Naming包中告诉GNAT有其他命名的文件。

以下是一个简单的示例:

project OpenID is
   ...

   package Naming is
      for Implementation ("Util.Log.Loggers.Traceback")
        use "util-log-loggers-traceback-gnat.adb";
      for Implementation ("Util.Serialize.IO.XML.Get_Location") 
        use "util-serialize-io-xml-get_location-xmlada-4.adb";
   end Naming;
end OpenID;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接