我有一个关于使用 C++ m4 宏的问题。我正在尝试编译其他人的代码,并且在其中一个头文件中有一行如下所示:
b4_copyright(C++ Skeleton parser for LALR(1) parsing with Bison, 2002, 2003)
这当然会在尝试编译代码时返回错误:
error: expected constructor, destructor, or type conversion before ‘(’ token
b4_copyright
安装野牛的 c.m4 文件中的定义是:
m4_define([b4_copyright],
[/* A Bison parser, made by GNU Bison b4_version. */
/* $1
m4_text_wrap([Copyright (C) $2 Free Software Foundation, Inc.], [ ])
...
This special exception was added by the Free Software Foundation in
version 2.2 of Bison. */])
我认为当flex和bison生成头文件时会发生错误。由于某种原因,当 Bison 遍历已解析的代码时,它不会像应有的那样抑制 m4 宏(在本例中为 b4_copyright)的输出。当它创建头文件时,它会从它运行的宏的标准输出中留下行。为什么会这样做?
根据 c.m4 文件(b4_copyright 的定义所在的位置),应该禁止输出。c.m4 文件也使用来自 m4sugar.m4 的定义。然而,这些定义似乎并未应用于 c.m4 文件中的任何地方,因为它没有使用 m4_divert 函数(在 m4sugar.m4 中定义)来抑制输出,就像我认为的那样。