【问题标题】:error: stray '\' in program in macro definition错误:宏定义中的程序中出现杂散“\”
【发布时间】:2014-04-19 06:56:44
【问题描述】:

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

【问题讨论】:

  • 您没有显示宏定义,您正在显示一些可能会生成一个的 Python 代码。该代码的输出在哪里?
  • 把两个宏分成两行怎么样?
  • 这是故意的吗?
  • @Dieter Lücking:我不知道。
  • @Steve:'\n' 应该分隔两个宏。不是吗?

标签: python c++ macros scons


【解决方案1】:

问题是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'会导致它在文件中放置一个换行符。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-07
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多