enums - 如何在 Fortran 中做几个枚举类型?

我试图在 Fortran 中声明几个枚举类型。

这个有趣的简单示例很好地说明了我的问题:

program Main
  
  enum, bind(c)
    enumerator :: Colors = 0
    enumerator :: Blue = 1
    enumerator :: Red = 2
    enumerator :: Green = 3
  end enum

  enum, bind(c)
    enumerator :: Size = 0
    enumerator :: Small = 1
    enumerator :: Medium = 2
    enumerator :: Large = 3
  end enum
      
  integer(kind(Colors)) :: myColor

  myColor = Green

  if (myColor == Large) then
    write(*,*) 'MyColor is Large'
  end if

end program Main

我还尝试将这个枚举包含在一个类型和许多其他东西中,但没有一个有效。

在这里我可以比较 ColorsSize。例如,在 C 中,当我声明 color 和一个 size typedef 枚举时,我没有这样的问题,因为这两种类型是不同的。

在 Fortran 中有几个枚举类型是否存在一个简单的解决方案?

否则,我想用一个包含 value 的整数成员声明几种类型,然后创建接口以重载我需要的运算符(比较、做作等)。我不确定解决方案是否可行,而且我可以做到。

回答1

Fortran 没有您希望使用的枚举类型。1

Fortran 中的枚举是一组枚举数。问题的程序有两个。

枚举器本身是一种命名(整数)常量,可与 C 的相应枚举类型互操作。它们的存在是为了 C 互操作性,而不是在 Fortran 中提供类似的功能。

问题中的枚举器 GreenLarge 是两个具有 value 3 的命名整数常量(某些,可能是不同的类型)。 Green==Large 是一个真正的表达式,无论常量的种类参数如何。

Fortran 中没有将变量限制为枚举的 values 的机制。常量可以等效地声明为

integer(kind=enum_kind1) :: Green = 3_enum_kind1
integer(kind=enum_kind2) :: Large = 3_enum_kind2

对于适当的类型 values(在这种情况下很可能是相同的:C_INT)和 Fortran 程序不会有任何区别。

如果您希望使用 C 和类似语言中存在的枚举类型,则必须使用非内在方法(如问题中所暗示的那样)。

1 2018 年当前版本的语言就是这种情况。目前,有一个关于下一次修订(暂定为 2023 年)的提议,以包括更接近此处所需的枚举类型。该规范在一个特定的https://j3-fortran.org/doc/year/22/22-007r1.pdf的 7.6.2 中给出。