2016-11-24 25 views
0

私のC++テストコードには単純なデリゲート関数があります。元の実装の.cppファイル(組み込みのもの)を含めることはできないので、PCで実行されているテストでdelegate .cppファイルを使用します。私の考えは、シグネチャに従って提供される括弧()と引数を除いて、実装のボディとして同じマクロを単純に使用することです。マクロ値としてのC++名前空間

私はのようなものを試してみました:

void Flash::init() 
{ 
    DELEGATE_DESTINATION(); 
} 

bool Flash::write(args) 
{ 
    DELEGATE_DESTINATION(args); 
} 

bool Flash::read(args) 
{ 
    DELEGATE_DESTINATION(args); 
} 

void Flash::init() 
bool Flash::write(args) 
bool Flash::read(args) 

は、埋め込まれたプロジェクト実施のものでものと同じです。テストファイルでは、単に呼び出しを偽の実装に中継します。 1つの可能な解決策は、中継を使用しない偽のクラスに既にシグネチャと実装を含めることです。

マクロを把握するのに苦労しています。まあ、その後C Preprocessor, Stringify the result of a macro を経た後に、私は場所に拡大するだけ偽物を得ることができます

FAKE_PREFIX__FUNCTION__ に展開

#define FAKE_PREFIX    fakes::device::Flash:: 
#define DELEGATE_DESTINATION FAKE_PREFIX##__FUNCTION__ 

:私のようなものを試してみました。

私の目標は、その上のを読み、を書くため

fakes::device::Flash::init 

などの結果を持っていることであろう。

+0

インラインネームスペースを使用することができます。 –

+0

@GuillaumeRacicotあなたが気にしていることの例を教えてください。私はそれを試してみましたが、簡潔な結果は得られませんでした...ありがとう。 – arapEST

+0

私は好きですが、残念ながらインラインネームスペースでの私の経験は限られています。ネストされた名前空間を「デフォルト」にするためにここにいることはわかっています。 –

答えて

0

あなたがしたいことは、はるかに簡単に行うことができます。あなたがトークンを連結していない

  1. ::が有効なトークンの一部ではありません):あなたはプリプロセッサのフルパワーを必要としません。 1つのマクロを別のマクロの隣に印刷するだけです。

  2. _FUNCTION_はプリプロセッサマクロではなく、文字列リテラル(in gccなどのコンパイラ)です。

だから、あなたがやりたい、あなたがマクロに関数名を渡す必要があります:

#define FAKE_PREFIX fakes::device::Flash:: 
#define DELEGATE_DESTINATION(func) FAKE_PREFIX func 

次に、あなたはこのように、あなたの関数を定義します。

bool Flash::write(args) 
{ 
    DELEGATE_DESTINATION(write)(args); 
} 

それがすべてですライブhere

+0

まだ未宣言の識別子を使用しています。FAKE_PREFIX__FUNCTION __ '' – arapEST

+0

@arapest、私の編集を参照してください。 – StoryTeller

関連する問題