代码之家  ›  专栏  ›  技术社区  ›  R71

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

  •  0
  • R71  · 技术社区  · 8 年前

    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 回复  |  直到 8 年前
        1
  •  2
  •   Some programmer dude    8 年前

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

    从…起 this default argument reference

        2
  •  0
  •   Mike Lischke    8 年前

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