У меня есть вопрос, касающийся использования макросов 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) для подавления вывода, как я думаю, это должно быть.
Ваша проблема довольно удивительна: пользователь никогда не должен подвергаться воздействию этих внутренних деталей, даже если вы стараетесь! В частности, с Flex вы можете делать все, что захотите, Bison должен оставаться стабильным: ему никогда не нужно читать файлы Flex.
Так что на самом деле, либо ваша установка M4 неверна, либо кто-то играл с вашими файлами скелета Bison (что никогда не должно происходить). В любом другом случае это ошибка, о которой следует сообщить в соответствующий список (bug-bison на gnu.org).
Других решений пока нет …