代码之家  ›  专栏  ›  技术社区  ›  oz10

Ada有预处理器吗?

  •  3
  • oz10  · 技术社区  · 16 年前

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

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

    你怎么能在艾达这样做?Ada有预处理器吗?

    6 回复  |  直到 12 年前
        1
  •  6
  •   Louis Brandy    16 年前

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

    几乎总是有办法解决缺少预处理器的问题,但通常情况下,解决方案可能有点麻烦。例如,您可以将特定于平台的函数声明为“separate”,然后使用构建工具编译正确的函数(项目系统、使用pragma body replacement或非常简单的目录系统…将所有Windows文件放在/windows/中,将所有Linux文件放在/linux/中,并包括平台的相应目录)。

    尽管如此,Gnat意识到有时候你需要一个预处理器,并创建了Gnatprep。不管编译器是什么,它都可以工作(但是您需要将它插入到您的构建过程中)。同样,对于简单的事情(如条件编译),您可能只需要使用C预处理器,甚至可以使用自己的非常简单的预处理器。

        2
  •  4
  •   Marc C    16 年前

    Adacore提供 gnatprep 预处理器,专门用于ADA。他们说gnatrep“不依赖于任何特殊的gnat特性”,所以听起来它应该与非gnat-ada编译器一起工作。他们的用户指南还提供了一些条件编译 advice .

    我在一个项目中也使用了M4,ADA规范和正文文件分别后缀为“.m4s”和“.m4b”。

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

        3
  •  3
  •   David Allan Finch    16 年前

    除了CPP预处理器或M4,不能在命令行上的任何文件上调用,也可以使用诸如make或ant之类的构建工具调用。我建议给你的.ada打个电话,再打些别的。我已经在Java文件上做了一段时间。我调用Java文件.M4,并使用make规则创建.java,然后以正常方式构建它。

    希望有帮助。

        4
  •  2
  •   Daniel Miller    14 年前

    一些旧的ADA1983时代的编译器有一个名为A.app的包,它使用ADA的前缀子集(在构建时解释)作为生成ADA的预处理语言(然后在编译时翻译为机器代码)。Rational的VerdixADA开发系统(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

        5
  •  1
  •   T.E.D.    16 年前

    不,不是。

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

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

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

        6
  •  1
  •   Rego    12 年前

    是的,它有。

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

    在这种情况下,您可以使用 gnatmake gprbuild 所以你不用跑了 格纳普雷普 用手。

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