Gcc Fortran#使用多行定义宏定义

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

我的印象是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)
你知道我做错了什么吗


第二个问题:“英特尔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也不起作用,只是检查了一下)。我一直在玩类似的东西。但是宏也应该起作用,我正在寻找解决这个问题的方法。最终,我会遇到一种强烈倾向于使用它的情况……不是真的,行长度限制无论如何都会生效。确实,需要使用编译器标志来限制行长度,但这可能会降低代码的可移植性。