antlr cpp target 的标头部分不允许使用具有默认参数的外部函数



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

(可以使用 -permissive 将此错误转换为警告,但这也会绕过其他错误,因此使用该编译器标志不是一个好的做法。所以我不使用此标志。

此问题在标头部分中的 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本身中是否有更好的方法可以做到这一点?

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

从此默认参数引用:

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

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

相关内容

  • 没有找到相关文章

最新更新