2017-08-28 64 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