2017-08-28 1 views
0

C++(g ++ 5.4.0)には奇妙な制限があります。第二行が許可されていますが、4番目の行が許可されていません:antlr cpp targetのヘッダセクションは、デフォルトの引数を持つ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ターゲットコードに現れます。次のヘッダーコード:私はこのような再符号化することにより、今、このエラーをバイパスしています

// 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 

しかし、より良い方法はあり

// G.g4: 
grammar G; 
@parser::header { 
extern xx(int x, int y=3); 
} 

は、以下のように生成されますantlr4自体でこれを行うには?

答えて

0

このコードを@headerアクションに挿入する必要がありますか?そうでない場合はother named actionsがあります。たとえば、@parser::definitionsのコンテンツは.cppにのみ送信されます。しかし、これはC++ターゲットでのみ利用可能な名前付きアクションです。

+0

それは正確に私の質問だった、私はヘッダーセクションに自分のコードを入れて、正しいことをしているかどうか。ありがとう、私は他のセクションを確認し、使用するかを決定します。 – R71

2

これはGCCの制限ではなく、C++の制限です。 this default argument referenceから

:再宣言がデフォルト(値が同じであっても)既に表示されている引数のデフォルト値を導入することができない

+0

明確化と言語仕様へのポインタをありがとう。しかし、ちょうど不思議なこと、なぜこのデフォルトの制限があるのですか? – R71

関連する問題