5

我还是 Ada 编程世界的新手,所以如果这个问题很明显,请原谅我。

我正在研究开发一个应用程序(在 Ada 中,使用 2005 修订版中的功能),它从串行端口读取并基本上执行从外部设备接收的字符串和数字的操作。

现在我的意图是可能首先使用 Florist 和 POSIX 终端接口在 Linux 上完成所有串行工作......我将使用 Windows/MacOS/etc... 其他时间,但我想保持该选项打开.

无论我做什么,我都想遵循 Ada 的最佳实践。因此,不是像 C 下的条件编译这样的 hack(我知道 Ada 无论如何都没有),我想知道您应该如何从命令行指定包文件的更改(例如 gnatmake)?

我现在唯一能想到的是我可以将所有平台包命名为完全相同(即包名称 Serial.Connector 具有相同的文件名)并将它们放在项目存档中的不同文件夹中,然后在编译时指定目录/库查找带有 -I 参数的文件并更改不同平台的目录名称。

这是我使用 C/C++ 为 GCC 展示的方式……这仍然是 Ada 使用 GNAT 的最佳方式吗?

谢谢,-乔什

4

3 回答 3

5

这是处理这种情况的一种完全可以接受的方式。如果可能的话,您应该有一个通用的包规范(或多个合适的规范),所有特定于平台的东西都严格限制在相应的包主体变体中。

(如果您确实想走预处理器路径,可以使用一个名为gnatprep的 GNAT 预处理器,但我也不喜欢条件编译,所以我建议使用单独的子目录方法。)

于 2010-07-23T18:48:27.113 回答
4

您可以使用 GNAT 项目文件package Naming:一个真实示例的摘录,我想在同一目录中的两个版本的包之间进行选择,其中一个带有调试添加,是

...
type Debug_Code is ("no", "yes");
Debug : Debug_Code := External ("DEBUG", "no");
...
package Naming is
   case Debug is
      when "yes" =>
         for Spec ("BC.Support.Managed_Storage")
           use "bc-support-managed_storage.ads-debug";
         for Body ("BC.Support.Managed_Storage")
           use "bc-support-managed_storage.adb-debug";
      when "no" =>
         null;
   end case;
end Naming;

要选择特殊命名,请将环境变量设置DEBUGyes或使用gnatmake -XDEBUG=yes.

于 2010-07-24T16:49:30.993 回答
3

是的,在 Ada 中处理此问题的普遍接受的方法是使用构建系统选择的不同文件来执行此操作。Gnu make 几乎是多平台的,并且可以允许您在不同的配置下构建不同的文件(具有不同的名称和/或目录以及所有内容)。

事实上,我发现这#ifdef在 C 中也是一种更好的方法(超过 s)。

于 2010-07-23T22:44:09.473 回答