GNU Fortran /预处理器问题与宏和双正斜杠

时间:2017-06-21 08:32:06

标签: makefile fortran c-preprocessor gnu gfortran

我最近将我的gnu编译器从4.8.4(在Ubuntu 14.04上)升级到5.4(Ubuntu 16.04),现在我使用的程序包不再编译。它适用于gnu 4.8.4。

首先,编译在我的makefile中停止在这一行:

cpp -std=c89 -C $(FLAGS) $(PARSER_INC) $(COMMON)/struct_parser.F90 > $(PARSER_NAME).F90

错误是:

../common/struct_parser.F90:53:31: error: C++ style comments are not allowed in ISO C90
    c_filename = trim(filename)//C_NULL_CHAR

似乎问题是用-std = c89调用了cpp,它有双正斜杠的问题(即使这是一个fortran连接,不是C代码的一部分)。 克服此错误的最佳方法是什么?如果我删除-std = c89然后编译继续前进,但我不相信这是一个很好的解决方案。 如果我删除了std行,那么我会从makefile的下一行生成一整套错误:

$(F90) -o $@ -c -nocpp $(FFLAGS) $(INC) -I$(COMMON)/obj $(AUXFLAGS) $(PARSER_NAME).F90

所有错误都是这样的,只是针对F90文件的不同行:

count = count + print_bool_scalar(ptr, max(0, length - count), XSTR(COMMON_FILE_FLAGS_T_VARIABLE)//'%'//XSTR(do_cloud)//C_NULL_CHAR, COMMON_FILE_FLAGS_T_VARIABLE%do_cloud)
                                                                                                                                                                    1
Error: Symbol ‘common_file_flags_t_variable’ at (1) has no IMPLICIT type
/media/data/Software/ORAC/trunk/obj/read_ctrl.f_pri.inc:4:172:

相关环境变量:

F90 = gfortran
FFLAGS=-O3 -g -cpp -ffree-line-length-0 -fopenmp

知道那里发生了什么吗?我认为它与我对cpp的第一个错误有关。 ' XSTR'顺便说一句,宏是定义的。

1 个答案:

答案 0 :(得分:3)

不要直接通过cpp使用预处理器。它是C预处理器,而不是Fortran预处理器。它没有正确处理Fortran(即//)。

要与Fortran兼容,必须在cpp中调用traditional-mode,gfortran会自动为您执行此操作。对于gfortran -cppgfortran文件,只需.F甚至.F90

如果你使用像变量宏这样的高级宏内容,你可能会运气不好,这里的提问者CPP/GPP in Fortran variadic macro (plus Fortran // concatenation)最终坚持使用旧的GCC版本。