【问题标题】:Conditional compilation in gfortrangfortran 中的条件编译
【发布时间】:2023-03-04 01:21:01
【问题描述】:

我想知道是否可以选择我的 Fortran 95 例程的不同部分进行编译。

例如,如果我将某个标志传递给 gfortran,那么编译器会选择哪个部分用于某个函数。我知道我可以在例程中使用if 来做到这一点,但缺点是由于速度问题我不希望程序一直运行if。我想解决方案应该类似于this one

我正在专门研究一个计算多体系统(比如一百万)中的能量的程序。然后我不想每次我需要在编译时使用不同的能量定义时都放一个if

我希望这是可能的,并且我的问题很明确。

【问题讨论】:

    标签: compilation fortran conditional gfortran flags


    【解决方案1】:

    您可以使用类似 C 的预处理器。 -cpp 命令行选项到您的命令行。默认情况下该选项未打开(根据下面的 Vladimir F 评论),尽管看起来使用 .F90 文件扩展名(即大写 F,而不是 .f90)会没有-cpp 选项的技巧。

    关于选项的详细信息:

    https://gcc.gnu.org/onlinedocs/gfortran/Preprocessing-Options.html

    然后你可以按照你指出的那样做,所以:

    #ifdef <some-var>
      code when <some-var> is true
    #elif defined(<other-var>)
      code when <other-var> is true
    #endif
    

    根据需要。

    this page 上有更多示例,带有实际代码。

    此外,与 C/C++ 一样,您可以在命令行上使用-D 选项定义宏:

    gfortran -DCASE1=3 ...
    

    这将使用值3 定义CASE1。如果您不指定该值,则1 会自动分配给宏。这记录在同一页面上。

    【讨论】:

    • 使用 cpp 预处理器效果很好。我不知道这存在。非常感谢,亚历克西斯!
    • 我认为#elsif 是一个错字。它应该是#elif
    • 扩展名应使用大写字母(即 .F90 而不是 .f90)。这是大多数编译器自动知道他们应该预处理代码的方式(引自您帖子中的第二个链接)。
    • 我将两个 cmets 都应用于我的答案。 #elsif 的好消息。此外,您需要将defined() 等同于#ifdef
    猜你喜欢
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 2013-06-21
    相关资源
    最近更新 更多