7

为了在 C/C++ 中支持多个平台,可以使用预处理器来启用条件编译。例如,

#ifdef _WIN32
  #include <windows.h>
#endif

你怎么能在 Ada 中做到这一点?Ada 有预处理器吗?

4

6 回答 6

8

您的问题的答案是否定的,Ada 没有内置于语言中的预处理器。这意味着每个编译器可能有也可能没有,并且没有用于预处理和条件编译之类的“统一”语法。这是故意的:它被认为对 Ada 精神“有害”。

几乎总有一些方法可以解决缺少预处理器的问题,但通常解决方案可能有点麻烦。例如,您可以将特定于平台的函数声明为“单独的”,然后使用构建工具编译正确的函数(项目系统,使用 pragma 正文替换,或非常简单的目录系统......把所有的 windows 文件在 /windows/ 和 /linux/ 中的所有 linux 文件,并包含平台的相应目录)。

话虽如此,GNAT 意识到有时您需要一个预处理器并创建了 gnatprep。无论编译器如何,它都应该可以工作(但您需要将其插入到构建过程中)。同样,对于简单的事情(如条件编译),您可能只使用 c 预处理器,甚至可以使用您自己的非常简单的预处理器。

于 2008-11-20T13:57:26.480 回答
7

AdaCore 提供了gnatprep预处理器,专门用于 Ada。他们声明 gnatprep “不依赖于任何特殊的 GNAT 功能”,因此听起来它应该与非 GNAT Ada 编译器一起使用。他们的用户指南还提供了一些条件编译建议

我一直在使用 m4 的项目中,Ada 规范和正文文件分别后缀为“.m4s”和“.m4b”。

我的偏好是完全避免预处理,只使用专门的机构,设置 CM 和构建过程来管理它们。

于 2008-11-18T21:27:21.657 回答
3

不可以,但是可以在命令行上的任何文件上调用 CPP 预处理器或 m4,或者使用 make 或 ant 等构建工具。我建议将您的 .ada 文件称为其他名称。我在java文件上做了一段时间。我调用 java 文件 .m4 并使用 make 规则创建 .java,然后以正常方式构建它。

我希望这会有所帮助。

于 2008-11-12T13:27:31.323 回答
3

是的,它有。

如果您使用的是 GNAT 编译器,则可以gnatprep用于进行预处理,或者如果您使用 GNAT Programming Studio,您可以配置项目文件以定义一些条件编译开关,例如

#if SOMESWITCH then
-- Your code here is executed only if the switch SOMESWITCH is active in your build configuration
#end if;

在这种情况下,您可以使用gnatmakeorgprbuild所以您不必gnatprep手动运行。

这非常有用,例如,当您需要使用甚至不同的交叉编译器为几个不同的操作系统编译相同的代码时。

于 2011-11-25T03:00:08.270 回答
2

一些旧的 Ada1983 时代的编译器有一个名为 a.app 的包,它利用 Ada 的 # 前缀子集(在构建时解释)作为生成 Ada 的预处理语言(然后在编译时翻译成机器代码)。Rational 的 Verdix Ada 开发系统 (VADS) 似乎是几个 Ada 编译器中 a.app 的祖先。例如,Sun Microsystems 从 VADS 派生了 Ada SPARCompiler,因此也有一个.app。这与 IBM 使用 PL/I 作为 PL/I 的预处理器没有什么不同。

第 2 章是关于 a.app 的一些文档:http: //dlc.sun.com/pdf/802-3641/802-3641.pdf

于 2010-04-10T14:03:12.137 回答
0

不,不是的。

如果你真的想要一个,有办法得到一个(使用 C,使用独立的,等等)但是我反对它。没有一个是一个有目的的设计决定。预处理器的整个想法非常不合时宜。

C 的预处理器的大部分用途都可以在 Ada 中以其他更可靠的方式完成。唯一的主要例外是对源文件进行细微更改以支持跨平台。考虑到这在典型的跨平台 C 程序中被滥用了多少,我仍然很高兴 Ada 不支持它。很少有 C/C++ 开发人员可以控制自己以保持更改“较小”。结果可能有效,但人类通常几乎不可能阅读。

完成此任务的典型 Ada 方法是将不同的代码放在不同的文件中,并使用您的构建系统在编译时以某种方式在它们之间进行选择。Make 足够强大,可以帮助您做到这一点。

于 2008-11-20T14:23:03.697 回答