宏定义中的编译器错误"错误:程序中杂散的'\'"

Compiler error "error: stray '' in program" in macro definition

本文关键字:错误 编译器 宏定义 程序      更新时间:2023-10-16

在尝试使用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"

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

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

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

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

当它这样放的时候,你可以更清楚地看到错误:shell看到转义序列"\",所以它打印一个\,后面跟着一个n,而不是转义序列"n",这会导致它在文件中放一个换行符。