Fortran #define宏定义有多行

时间:2014-12-07 04:29:47

标签: 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 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风格的宏?如果是这样,是否需要编译器标志?

2 个答案:

答案 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具有可以使用的语句分隔符(;)。不幸的是,行长度是有限的,所以你的宏不能很长,也不能包含多个控制结构。