我的印象是C风格的宏定义在gfortran中工作了吗?
#define ERROR_CHECKER(msg,stat) \
IF (stat.NE.0) THEN \
DO i = 1,BIG \
IF(msg(i).NE.C_NULL_CHAR)THEN \
ErrMsg(i:i) = msg(i) \
ELSE \
EXIT \
END IF \
END DO\
IF(stat.EQ.1) THEN \
ErrStat = ID_Warn \
ELSE \
ErrStat = ID_Fatal \
RETURN \
END IF \
END IF
但是这个错误毁了我的一天:
IF (stat.NE.0) THEN DO i = 1,BIG IF(message
1
Error: Cannot assign to a named constant at (1)
我在这里做错了什么想法?
次要问题:intel fortran是否认可c风格的宏?如果是这样,是否需要编译器标志?
答案 0 :(得分:1)
除了这样的宏方法不是好的样式之外,你在生成的代码中缺少必要的换行符。这可以通过在宏定义中的每个反斜杠之前加一个分号来修复(第一行除外)。
答案 1 :(得分:0)
只需将宏转换为函数,而不是使用宏。这样,您就没有对具有宏功能的Fortran编译器的大量依赖
LOGICAL FUNCTION ERROR_CHECKER(msg,stat)
character*(*) msg(*)
integer stat
IF (stat.NE.0) THEN
DO i = 1,BIG
IF(msg(i).NE.C_NULL_CHAR)THEN
ErrMsg(i:i) = msg(i)
ELSE
EXIT
END IF
END DO
IF(stat.EQ.1) THEN
ErrStat = ID_Warn
ELSE
ErrStat = ID_Fatal
RETURN .FALSE.
END IF
END IF
RETURN .TRUE.
END FUNCTION
在您的代码中
IF (ERROR_CHECKER(msg, stat)) RETURN
编辑:一些较新版本的Fortran具有可以使用的语句分隔符(;)。不幸的是,行长度是有限的,所以你的宏不能很长,也不能包含多个控制结构。