如何针对代码区域临时禁用m4的--synclines选项?
问题
m4 的 --synclines(简称 -s)选项会输出 #line 行以同步源文件与输出文件的行号,但该选项会破坏C宏定义的语法有效性。
以下是示例 m4 源文件 test.m4:
#define MACRO blabla \ ifelse(`', `', `dnl a \ b \ ', `dnl c \ d \ ') \ /* */
启用 --synclines 执行命令:
m4 -sg test.m4
输出结果(插入的 #line 导致C宏语法失效):
#line 1 "test.m4" #define MACRO blabla \ a \ #line 2 b \ #line 2 \ #line 9 /* */
不启用 --synclines 执行命令:
m4 -g test.m4
输出结果(宏定义语法正常):
#define MACRO blabla \ a \ b \ \ /* */
请问能否在m4中针对特定代码段临时禁用 synclines 功能?
解决方案
可以通过m4内置的 synclines() 宏临时开启或关闭行号同步,从而保护C宏定义不被插入破坏语法的 #line 行。
具体实现
在需要保护的代码段前调用 synclines(0) 关闭行号同步,代码段结束后调用 synclines(1) 恢复功能:
synclines(0)dnl #define MACRO blabla \ ifelse(`', `', `dnl a \ b \ ', `dnl c \ d \ ') \ /* */ synclines(1)dnl
执行 m4 -sg test.m4 后,输出的宏定义会保持语法完整,同时后续代码仍保留行号同步的 #line 行:
#define MACRO blabla \ a \ b \ \ /* */ #line 9 "test.m4"
注意事项
- 使用
dnl消除宏调用后的换行符,避免输出多余空行 - 务必在无需保护的代码段及时恢复
synclines(1),否则后续代码会丢失行号同步能力
内容的提问来源于stack exchange,提问作者KamilCuk
相关产品推荐
相关产品推荐

