【问题标题】:Does Ada have a preprocessor?Ada 有预处理器吗?
【发布时间】:2008-11-12 13:13:15
【问题描述】:

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

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

您如何在 Ada 中做到这一点? Ada 有预处理器吗?

【问题讨论】:

    标签: cross-platform ada


    【解决方案1】:

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

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

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

    【讨论】:

    • “然后使用构建工具编译正确的”顺便说一句,这是一个非常好的建议。当时在 Ada 中这对我来说不是一个选项,但我现在在 C/C++ 中使用这种技术和介子。
    【解决方案2】:

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

    我参与的项目也使用了 m4,Ada 规范和正文文件分别以“.m4s”和“.m4b”为后缀。

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

    【讨论】:

    • 我们实际上使用了两个编译器,每个平台一个(不是一个选项)。 GNAT 就是其中之一,但我希望有一些可以跨编译器工作的东西。
    • “建议”很棒。谢谢!你改变了我对多平台 ADA 计划的看法。
    【解决方案3】:

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

    希望对你有帮助。

    【讨论】:

    • 这不会导致调试代码出现问题,因为源代码与 Ada 编译器处理的源代码不同。
    • 智能构建您的 m4 宏,您可以让条件编译在已注释块中保留未选择的分支和宏调用,同时取消对选定分支的注释。这样,源代码和编译器输出将匹配以进行调试。
    【解决方案4】:

    是的,它有。

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

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

    【讨论】:

      【解决方案5】:

      一些旧的 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

      【讨论】:

        【解决方案6】:

        不,它没有。

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

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

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

        【讨论】:

          猜你喜欢
          • 2013-12-15
          • 1970-01-01
          • 1970-01-01
          • 2010-10-23
          • 2014-10-01
          • 2011-03-09
          • 1970-01-01
          • 2015-07-31
          • 1970-01-01
          相关资源
          最近更新 更多