我试图在 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
我还尝试将这个枚举包含在一个类型和许多其他东西中,但没有一个有效。
在这里我可以比较 Colors
和 Size
。例如,在 C 中,当我声明 color
和一个 size
typedef 枚举时,我没有这样的问题,因为这两种类型是不同的。
在 Fortran 中有几个枚举类型是否存在一个简单的解决方案?
否则,我想用一个包含 value 的整数成员声明几种类型,然后创建接口以重载我需要的运算符(比较、做作等)。我不确定解决方案是否可行,而且我可以做到。
回答1
Fortran 没有您希望使用的枚举类型。1
Fortran 中的枚举是一组枚举数。问题的程序有两个。
枚举器本身是一种命名(整数)常量,可与 C 的相应枚举类型互操作。它们的存在是为了 C 互操作性,而不是在 Fortran 中提供类似的功能。
问题中的枚举器 Green
和 Large
是两个具有 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 中给出。