【发布时间】:2008-11-12 13:13:15
【问题描述】:
要在 C/C++ 中支持多个平台,可以使用预处理器来启用条件编译。例如,
#ifdef _WIN32
#include <windows.h>
#endif
您如何在 Ada 中做到这一点? Ada 有预处理器吗?
【问题讨论】:
标签: cross-platform ada
要在 C/C++ 中支持多个平台,可以使用预处理器来启用条件编译。例如,
#ifdef _WIN32
#include <windows.h>
#endif
您如何在 Ada 中做到这一点? Ada 有预处理器吗?
【问题讨论】:
标签: cross-platform ada
您的问题的答案是否定的,Ada 没有内置于语言中的预处理器。这意味着每个编译器可能有也可能没有,并且没有用于预处理和条件编译之类的“统一”语法。这是故意的:它被认为对 Ada 精神“有害”。
几乎总有办法解决缺少预处理器的问题,但解决方案通常会有点麻烦。例如,您可以将特定于平台的函数声明为“单独的”,然后使用构建工具编译正确的函数(项目系统,使用 pragma 正文替换,或非常简单的目录系统......把所有的 windows 文件在 /windows/ 和 /linux/ 中的所有 linux 文件,并包含平台的相应目录)。
话虽如此,GNAT 意识到有时您需要预处理器并创建了 gnatprep。无论编译器如何,它都应该可以工作(但您需要将其插入到构建过程中)。同样,对于简单的事情(如条件编译),您可能只使用 c 预处理器,甚至可以使用您自己的非常简单的预处理器。
【讨论】:
【讨论】:
不可以,但是可以在命令行上的任何文件上调用 CPP 预处理器或 m4,或者使用 make 或 ant 等构建工具。我建议将您的 .ada 文件称为其他名称。我在java文件上做了一段时间。我调用 java 文件 .m4 并使用 make 规则创建 .java,然后以正常方式构建它。
希望对你有帮助。
【讨论】:
是的,它有。
如果您使用 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,这样您就不必手动运行gnatprep。
这非常有用,例如,当您需要使用甚至不同的交叉编译器为几个不同的操作系统编译相同的代码时。
【讨论】:
一些旧的 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
【讨论】:
不,它没有。
如果你真的想要一个,有办法得到一个(使用 C,使用独立的,等等)但是我反对它。没有一个是一个有目的的设计决定。预处理器的整个想法非常不合时宜。
C 预处理器的大部分用途都可以在 Ada 中以其他更可靠的方式完成。唯一的主要例外是对源文件进行细微更改以支持跨平台。考虑到这在典型的跨平台 C 程序中被滥用了多少,我仍然很高兴 Ada 不支持它。很少有 C/C++ 开发人员可以控制自己以使更改保持“微小”。结果可能有效,但人类通常几乎不可能阅读。
完成此操作的典型 Ada 方法是将不同的代码放在不同的文件中,并使用您的构建系统在编译时以某种方式在它们之间进行选择。 Make 功能强大,足以帮助您做到这一点。
【讨论】: