секция заголовка цели antlr cpp не позволяет использовать внешние функции с аргументами по умолчанию

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?

0

Решение

Нужно ли помещать этот код в действие @header? Если нет другие названные действия Вы могли бы использовать. Например @parser::definitions содержание идет .cpp только. Но это именованное действие, которое доступно только в цели C ++.

0

Другие решения

Это не ограничение в GCC, это ограничение C ++.

От эта ссылка на аргумент по умолчанию:

Переопределение не может вводить значение по умолчанию для аргумента, для которого значение по умолчанию уже видно (даже если значение совпадает).

2

По вопросам рекламы [email protected]