含%标记的古老.c文件:语法识别与现代编译方法咨询
含%标记的古老.c文件:语法识别与现代编译方法咨询
哦,这种混合语法的老代码我之前维护过类似的,简直是软件考古现场😂 先给你拆解清楚:
一、语法识别:这是FPP(Fortran预处理器)混入C代码了
那些带%开头的%IF/%ENDIF/%INCLUDE语法,确实是**Fortran预处理器(FPP)**的指令。30年前的开发环境没现在这么标准化,很多跨平台项目(尤其是同时写Fortran和C的团队)会统一用FPP来做条件编译——毕竟当时不同编译器的C预处理器(CPP)兼容性还不好,而FPP的跨平台表现反而更稳定,所以就出现了用FPP处理C文件的“混搭”操作。
你看到的代码结构就是:纯C代码主体 + FPP条件编译指令,注释用C风格的/**/和//也很合理,因为FPP只会处理%开头的行,其他内容原封不动保留,所以写代码的人直接用C的注释习惯完全没问题。
二、现代编译的具体步骤
完全不用找30年前的古董编译器,用现在的GNU工具链就能搞定,分两步走最稳妥:
第一步:用gfortran的FPP预处理代码,得到纯标准C文件
打开终端,运行这个命令:gfortran -E -x fpp your_old_code.c -o processed_code.c解释下参数:
-E:只执行预编译步骤,不进行后续编译-x fpp:明确告诉gfortran用FPP语法处理输入文件
执行完后,你可以打开processed_code.c看看,所有%开头的指令都会被处理(符合条件的%INCLUDE会展开,不符合的%IF分支会被删掉),剩下的就是纯C代码了。
第二步:用标准C编译器编译预处理后的文件
用gcc或者clang都可以,比如:gcc processed_code.c -o your_program如果老代码用的是非常旧的C标准(比如C89),可以加参数兼容:
gcc -std=c90 processed_code.c -o your_program一步到位(跳过中间文件)
要是不想生成中间的.c文件,也可以把两个步骤用管道串起来:gfortran -E -x fpp your_old_code.c | gcc -x c - -o your_program这里
-x c告诉gcc从标准输入读取的是C代码,-表示输入来自管道。
三、注意事项
- 预处理后最好检查下代码,比如有没有隐式函数声明、旧类型转换语法这些在新C标准里会报错的内容,必要时给gcc加
-Wno-implicit-function-declaration这类兼容参数。 - 如果需要定义编译宏(比如模拟WIN32环境),可以在gfortran命令里加
-DWIN32参数,比如:gfortran -E -x fpp -DWIN32 your_old_code.c -o processed_code.c
内容来源于stack exchange
相关产品推荐
相关产品推荐

