antlr cpp target的header部分不允许使用默认参数的extern函数

时间:2017-08-28 07:02:54

标签: c++ antlr4

C ++(g ++ 5.4.0)有一个奇怪的限制。允许第二行,但不允许第四行:

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可以将此错误转换为警告,但也会绕过其他错误,因此使用该编译器标志不是一个好习惯。所以我不使用此标志。)

此问题在标题部分的antlr cpp目标代码中显示。以下标题代码:

// 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本身有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

这不是GCC的限制,这是C ++的限制。

来自this default argument reference

  

重新声明不能为已经显示默认值的参数引入默认值(即使值相同)。

答案 1 :(得分:0)

是否有必要将此代码放入@header操作中?如果没有,您可以使用other named actions。例如,@parser::definitions内容仅转到.cpp。但这是一个命名操作,只能在C ++目标中使用。