Ada有预处理器吗?

时间:2008-11-12 13:13:15

标签: cross-platform ada

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

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

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

6 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:3)

否,但可以在命令行上的任何文件上调用CPP预处理器或m4,也可以使用make或ant等构建工具调用。我建议把你的.ada文件叫做别的。我已经在java文件上做了一段时间了。我调用java文件.m4并使用make规则创建.java,然后以正常方式构建它。

我希望有所帮助。

答案 3 :(得分:2)

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

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

答案 4 :(得分:2)

是的,它有。

如果您使用的是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;

在这种情况下,您可以使用gnatmakegprbuild,这样您就不必手动运行gnatprep

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

答案 5 :(得分:1)

不,它没有。

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

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

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