Ada有预处理器吗?

7

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

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

你怎样才能在Ada中实现这个?Ada有预处理器吗?
6个回答

8
AdaCore提供了gnatprep预处理器,专门用于Ada语言。他们声称gnatprep“不依赖于任何特殊的GNAT功能”,因此似乎它应该可以与非GNAT Ada编译器一起使用。他们的用户指南还提供了一些条件编译建议
我曾参与一个项目,其中也使用了m4,Ada规范和主体文件的后缀分别为“.m4s”和“.m4b”。
我的首选是尽可能避免预处理,并只使用专门的主体文件,设置CM和构建过程来管理它们。

我们实际上使用了两个编译器,每个平台一个(没有其他选择)。GNAT是其中之一,但我希望能找到适用于所有编译器的解决方案。 - oz10
“建议”非常好。谢谢!你改变了我对多平台ADA程序的看法。 - Diego Fernández Durán

8
你的问题的答案是否定的,Ada语言没有内置预处理器。这意味着每个编译器可能具有或不具有预处理器,并且没有“统一”的语法用于预处理和条件编译等。这是有意为之的:它被认为是有害于Ada精神。
几乎总会有解决缺乏预处理器的方法,但解决方案往往有点繁琐。例如,您可以将平台特定的函数声明为“separate”,然后使用构建工具来编译正确的函数(可以使用项目系统、使用pragma body replacement或非常简单的目录系统...将所有Windows文件放在/windows/中,将所有Linux文件放在/linux/中,并包含适当的目录以供平台使用)。
话虽如此,GNAT意识到有时您需要预处理器,并创建了gnatprep。它应该适用于任何编译器(但您需要将其插入到构建过程中)。同样,对于简单的事情(如条件编译),您可能只需使用c预处理器甚至自己编写非常简单的预处理器即可。

“然后使用构建工具编译正确的版本”,这是一个非常好的建议。当时在Ada中这不是我的选择,但现在我在C/C++中使用meson技术来实现这一点。 - oz10

3
没有,但是CPP预处理器或m4可以在命令行上调用任何文件或使用类似于make或ant的构建工具。我建议将您的.ada文件重命名为其他名称。我已经在java文件上这样做了一段时间。我将java文件命名为.m4,并使用make规则创建.java文件,然后按照正常方式进行构建。
希望能对你有所帮助。

这难道不会因为源代码与 Ada 编译器处理的代码不同而导致调试代码时出现问题吗? - David Arno
聪明地构建您的m4宏,您可以让条件编译保留未选中的分支和宏调用在注释块中,而选择的分支则变为取消注释状态。这样源代码和编译器输出将匹配,以便进行调试。 - JUST MY correct OPINION

3

是的,已经有了。

如果您正在使用GNAT编译器,可以使用gnatprep进行预处理。如果您使用GNAT编程工作室,则可以配置项目文件以定义一些条件编译开关,例如:

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

在这种情况下,您可以使用gnatmakegprbuild,因此您不必手动运行gnatprep。 这非常有用,例如,当您需要使用不同的交叉编译器为几个不同的操作系统编译相同的代码时。

2
一些旧版的Ada1983编译器有一个名为a.app的包,它利用以#为前缀的Ada子集(在构建时解释)作为预处理语言来生成Ada(然后在编译时将其翻译成机器代码)。Rational的Verdix Ada Development System(VADS)似乎是几个Ada编译器中a.app的鼻祖。例如,Sun Microsystems从VADS派生了Ada SPARCompiler,因此也有a.app。这与IBM使用PL/I作为PL/I的预处理器类似。 第二章是关于a.app外观的一些文档: http://dlc.sun.com/pdf/802-3641/802-3641.pdf

0

不,它没有。

如果你真的想要一个,有一些方法可以获得一个(使用C语言,使用独立的预处理器等)。然而,我会反对这样做。不拥有预处理器是一个有意的设计决策。整个预处理器的概念在Ada中非常不适用。

C语言预处理器的大部分用途在Ada中都可以通过其他更可靠的方式实现。唯一的主要例外是在源文件中进行小的更改以支持跨平台。考虑到在典型的跨平台C程序中这种方式被滥用的程度,我仍然很高兴Ada中没有对其提供支持。很少有C/C++开发人员能够控制自己,使更改保持“小”的程度。结果可能有效,但通常几乎无法阅读。

完成此操作的典型Ada方式是将不同的代码放在不同的文件中,并使用构建系统在编译时选择它们之间的区别。Make足够强大,可以帮助您完成此操作。


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