1

包的文件名是否可以与其实际名称不同?我尝试使用下面的编译指示,但出现“编译指示源文件名项目参数的标识符不正确”之类的错误

package Parent_With_Very_Long_Name is end Parent_with_Very_Long_Name;
...
package Parent_With_Very_Long_Name.Child is
    pragma Source_File_Name_Project("parent-child.ads");
end Parent_With_Very_Long_Name.Child;
4

2 回答 2

3

Ada 源文本的实际存储在技术上是编译器的实现细节。

查看您的编译器期望的文件名,我猜您正在使用 GNAT (GCC-Ada)。GNAT 允许您覆盖项目文件中的默认命名方案:

project Short_File_Names is
   package Naming is
      for Specification ("Parent_With_Very_Long_Name.Child")
        use "parent-child.ads";
   end Naming;
end Short_File_Names;
于 2013-10-03T07:17:31.513 回答
3

的文档pragma Source_File_Name说语法是

 pragma Source_File_Name (
   [Unit_Name   =>] unit_NAME,
   Spec_File_Name =>  STRING_LITERAL,
   [Index => INTEGER_LITERAL]);

 pragma Source_File_Name (
   [Unit_Name   =>] unit_NAME,
   Body_File_Name =>  STRING_LITERAL,
   [Index => INTEGER_LITERAL]);

所以编译器抱怨的原因是你使用了不正确的语法。使用正确的语法,那将是

package Parent_With_Very_Long_Name.Child is
   pragma Source_File_Name 
     (Parent_With_Very_Long_Name.Child, Spec_File_Name => "parent-child.ads");
end Parent_With_Very_Long_Name.Child;

但编译器现在说

parent-child.ads:2:01: incorrect placement for configuration pragma "Source_File_Name"

此配置 pragma 的正确位置是在单元之前:

pragma Source_File_Name 
  (Parent_With_Very_Long_Name.Child, Spec_File_Name => "parent-child.ads");
package Parent_With_Very_Long_Name.Child is
end Parent_With_Very_Long_Name.Child;

这一切都很好,但是其他单位怎么知道呢?(GNAT 有一个基于源的编译模型)。一个答案是默认情况下将编译指示放在配置文件中gnat.adcpackage Naming正如 Jacob Sparre Andersen 所建议的那样,更好的答案是使用 GNAT 项目文件和。

于 2013-10-03T08:40:26.693 回答