C ++ (g ++ 5.4.0) имеет странное ограничение. 2-я строка разрешена, но 4-я строка не разрешена:
extern yy(int x);
extern yy(int x); // re-declaration of an extern function is allowed
extern xx(int x, int y=3);
extern xx(int x, int y=3); // but re-declaration of an an extern function with default args is not allowed
(Эту ошибку можно преобразовать в предупреждение с помощью -fpermissive, но это также позволяет обойти и другие ошибки, поэтому не рекомендуется использовать этот флаг компилятора. Поэтому я не использую этот флаг.)
Эта проблема проявляется в целевом коде cpp antlr в разделе заголовка. Следующий код заголовка:
// G.g4:
grammar G;
@parser::header {
extern xx(int x, int y=3);
}
генерируется как:
// GParser.h:
extern xx(int x, int y=3);
...
// GParser.cpp:
extern xx(int x, int y=3);
#include "GParser.h"...
Я обхожу эту ошибку сейчас, перекодировав так:
// G.g4:
@parser::header {
#include "GHeader.h"}
// GHeader.h:
#ifndef GHEADER
#define GHEADER
extern xx(int x, int y=3);
#endif //GHEADER
Но есть ли лучший способ сделать это в самом antlr4?
Нужно ли помещать этот код в действие @header? Если нет другие названные действия Вы могли бы использовать. Например @parser::definitions
содержание идет .cpp
только. Но это именованное действие, которое доступно только в цели C ++.
Это не ограничение в GCC, это ограничение C ++.
От эта ссылка на аргумент по умолчанию:
Переопределение не может вводить значение по умолчанию для аргумента, для которого значение по умолчанию уже видно (даже если значение совпадает).