【问题标题】:Can I assume that the Fortran preprocessor will work on most systems?我可以假设 Fortran 预处理器适用于大多数系统吗?
【发布时间】:2014-09-11 14:11:13
【问题描述】:

我正在尝试在 Fortran 中模拟 C 断言,以强制执行我所有过程的前置条件和后置条件。通过这种方式,我可以为用户提供更多关于运行时错误的详细信息,而不是我可以合理预期的维护。

为了实现这一点,我使用了预处理器指令 __FILE____LINE__,并定义了一个扩展为 Fortran 子例程调用的 assert 宏。我没有尝试在这里描述它,而是创建了一个git repo,其中包含一些示例代码。如果你用

构建它
make test
./test

函数挂起,因为您调用了一个函数,该函数需要一个正参数和一个负参数。但是,如果您使用

make test DEBUG=1
./test

错误被断言捕获。

这适用于 gfortran 和英特尔 Fortran 编译器。我无权访问其他 Fortran 编译器。如果文件扩展名是.F90,我可以合理地期望其他编译器进行必要的源预处理吗?还是我应该依赖-cpp 标志?最便携的方法是什么?我什至应该这样做吗?

【问题讨论】:

  • 我要补充一点,如果 CPP 预处理器未集成在某些 Fortran 编译器中,您可以直接使用它。它包含在所有 C 编译器中,在每个系统上都可用。
  • 使用任何 C 预处理器都必须小心,因为他们习惯于去掉他们认为是 cmets 的内容。因为// 是一个有效的 C 或 C++ 注释,对于任何带有字符连接的 Fortran 代码或特定的常见或格式语句,它可能会产生令人惊讶的结果。

标签: fortran preprocessor


【解决方案1】:

可以合理地预期可以使用合适的“类 C”预处理器,但对于某些编译器或工具无疑会有例外。

可移植性的定义取决于您的观点,但鉴于大量系统使用不区分大小写的文件系统运行,仅依靠大小写来指定需要运行预处理器是不合理的。大多数与 Fortran 相关的构建系统都会通过某种方式明确说明该规范。

这是否是一个好主意有点主观。也许它只是名义上的影响,但需要预处理器仍然代表着可移植性的降低和构建复杂性的增加。根据编译器的不同,使用预处理器可能会妨碍使用标准一致性诊断等功能。

因此,我更喜欢像这样相对简单的用例,将断言编码为普通的 Fortran 源代码 - 一个 if 语句测试来自调试模块或类似模块的命名常量,调用 [ERROR] STOP(不是 exit)如果断言表达式失败,则带有描述性消息。

USE DebuggingFlags

IF (debug_flag) THEN
  IF (x <= 0) ERROR STOP 'negative or zero x in sqrrt!'
END IF

这不会为您提供文件和行信息,但只要您对 STOP 消息有一定的选择性,相关来源应该不会太难找到。

“发布”构建是在调试标志常量定义为 false(或您选择的等效项)的情况下进行的,并且在任何类型的合理编译器优化活动的情况下,与断言相关的目标代码应被识别并消除为死代码。

但有利也有弊。

【讨论】:

    【解决方案2】:

    Fortran 95+ 在标准中定义了条件编译 (coco),但只有少数编译器支持它。 de facto 标准(我相信从 Fortran 90 开始)仍然是 cpp 和 fpp,大多数编译器都支持。两者都是highly compatible but not 100%。使用这些事实,在大多数情况下,依赖 cpp/fpp 样式的预处理器应该是安全的。

    【讨论】:

    • Coco 基本上已经死了。有想在 Fortran 中添加一些宏处理的想法,但他们没有使用coco 作为基础。
    【解决方案3】:

    补充@LeleDumbo的答案:

    据我所知,Fortran 2008 标准没有指定任何形式的预处理。这也意味着,没有标准的方式来指定如何调用预处理器。但是,通常使用.F90 来指定预处理的需要。

    关于 COCO:Fortran 标准 ISO 1539-3 中应指定条件编译的第三部分已被撤回。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-21
      • 1970-01-01
      • 1970-01-01
      • 2015-07-12
      • 2013-04-13
      • 2016-12-21
      • 1970-01-01
      • 2011-05-31
      相关资源
      最近更新 更多