2017-08-28 40 views
0

C++(G ++ 5.4.0)具有奇怪的限制。第二行是允许的,但4号线是不允许的:标题部分不允许extern函数与默认参数

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本身做到这一点?

回答

0

是否有必要把这个代码在@header行动?如果没有,您可以使用other named actions。例如@parser::definitions内容去只有.cpp。但是这是一个只在C++目标中可用的命名操作。

+0

这正是我的问题,是否通过将我的代码放在标题部分来做正确的事情。谢谢,我会检查其他部分并决定使用哪个部分。 – R71

2

这不是在GCC的限制,这是一个C++的限制。

this default argument reference

甲重声明不能引入用于针对其默认已经可见(即使该值是相同的)的参数的缺省值。

+0

感谢您的澄清和指针的语言天赋。但只是好奇,为什么只限于默认的限制? – R71