Gcc Fortran#使用多行定义宏定义
我的印象是C风格的宏定义在gfortran中工作Gcc Fortran#使用多行定义宏定义,gcc,macros,fortran,c-preprocessor,gfortran,Gcc,Macros,Fortran,C Preprocessor,Gfortran,我的印象是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
#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)
你知道我做错了什么吗
第二个问题:“英特尔fortran”能识别c风格的宏吗?如果需要,是否需要编译器标志?不使用宏,只需将宏转换为函数即可。这样,您就不会对具有宏功能的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具有可使用的语句分隔符(;)。不幸的是,行长度有限,因此宏不能很长,也不能包含多个控件结构。除了这种宏方法不是好的样式之外,在生成的代码中缺少必要的换行符。这可以通过在宏定义的每个反斜杠前加一个分号来解决(第一行除外)。如果扩展名不是:.fpp、.F、.F90、.FOR、.FTN或.fpp,则需要在ifort中使用-fpp标志。问题显然是,``没有生成以生成的代码结尾的行。(ifort-fpp也不起作用,只是检查了一下)。我一直在玩类似的东西。但是宏也应该起作用,我正在寻找解决这个问题的方法。最终,我会遇到一种强烈倾向于使用它的情况……不是真的,行长度限制无论如何都会生效。确实,需要使用编译器标志来限制行长度,但这可能会降低代码的可移植性。