错误:在宏定义的程序中迷路'\'

时间:2014-04-19 06:56:45

标签: python c++ macros scons

在尝试使用scons编译this program时,我们遇到了此错误

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 个答案:

答案 0 :(得分:2)

问题是Python代码在这一行中有太多的反斜杠:

'echo "#define ZSIM_BUILDDATE \\""`date`\\""\\\\n#define ZSIM_BUILDVERSION \\""no git repo\\""" >>' + versionFile)

这是由代码所需的少一个程序解析的,因此它最终会被' \\ n'最终在文件中作为两个字符' \'并且' n'而不是被解析为单个换行符。代码试图避免Python插入换行符,这会破坏shell命令,而是将转义序列传递给shell,以便 it 更改为换行符。 Python以原始字符串的形式提供了一种更简单的方法:

r'echo "#define ZSIM_BUILDDATE \""`date`\""\\n#define ZSIM_BUILDVERSION \""no git repo\""" >>' + versionFile)

当它像这样放置时,你可以更清楚地看到错误:shell看到了转义序列' \'所以它会打印一个\,后跟一个n,而不是逃脱序列' \ n'这将导致它在文件中添加换行符。