宏定义中的编译错误 "错误:程序中有多余的'\
在尝试用这个程序和SCons进行编译时,我们遇到了一个错误:
build/opt/zsim_harness.cpp:315:5: error: stray '\' in program
build/opt/zsim_harness.cpp:315:5: error: stray '#' in program
build/opt/zsim_harness.cpp: In function 'int main(int, char**)':
build/opt/zsim_harness.cpp:310:24: error: 'ZSIM_BUILDVERSION' was not declared in this scope
build/opt/zsim_harness.cpp:315:5: error: expected ')' before 'n'
build/opt/zsim_harness.cpp:315:5: error: 'ZSIM_BUILDVERSION' was not declared in this scope
出错的那一行是:
info("Starting zsim, built %s (rev %s)", ZSIM_BUILDDATE, ZSIM_BUILDVERSION);
ZSIM_BUILDVERSION
是一个在 SConstruct 文件中定义的宏
if os.path.exists(".git"):
env.Command(versionFile, allSrcs + [".git/index", "SConstruct"],
'echo "#define ZSIM_BUILDDATE \\""`date`\\""\\\\n#define ZSIM_BUILDVERSION \\""`python misc/gitver.py`\\""" >>' + versionFile)
else:
env.Command(versionFile, allSrcs + ["SConstruct"],
'echo "#define ZSIM_BUILDDATE \\""`date`\\""\\\\n#define ZSIM_BUILDVERSION \\""no git repo\\""" >>' + versionFile)
SCons 的版本是 2.1.0。我该怎么解决这个问题呢?
看起来 SCons 会生成一个文件,叫做 version.h,内容大概是:
#define ZSIM_BUILDDATE "Sat Apr 19 11:07:38 CET 2014"\n#define ZSIM_BUILDVERSION "master:10:a8c417b:1fc 1+ 1- 6b4f4490"
1 个回答
2
问题在于这行Python代码中有太多的反斜杠:
'echo "#define ZSIM_BUILDDATE \\""`date`\\""\\\\n#define ZSIM_BUILDVERSION \\""no git repo\\""" >>' + versionFile)
这个代码被一个比它预期的程序少的程序解析,所以最后'\\n'在文件中变成了两个字符:'\'和'n',而不是被解析成一个换行符。代码试图避免Python自动插入换行符,因为那样会破坏shell命令,而是想把这个转义序列传递给shell,让它来转换成换行符。Python其实提供了一种更简单的方法来做到这一点,就是使用原始字符串:
r'echo "#define ZSIM_BUILDDATE \""`date`\""\\n#define ZSIM_BUILDVERSION \""no git repo\""" >>' + versionFile)
当这样写的时候,你可以更清楚地看到错误:shell看到转义序列'\',所以它打印出一个反斜杠,后面跟着一个n,而不是转义序列'\n',这会导致它在文件中插入一个换行符。