2017-12-15 30 views
0

ルーティングレイヤ用にいくつかのマクロを作成しようとしています。ルータは別のモジュールから関数を呼び出すことができます。ルーティングはチャネルに基づいています。マクロ名を連結する

RouterInit(CH0,param); 
:私はこれを行うotの欲しい

#define GetModule(channel) (channel##_Module) 
#define RouterInit(channel,param) GetModule(channel)##_Init(param) 

typedef enum 
{ 
    AModule, 
    BModule 
}Module; 

typedef enum 
{ 
    CH0, 
    CH1 
}Channels; 

構成:

#define AModule_Init(param) ExternalInitFunction(param) 
#define CH0_Module AModule 
#define CH1_Module BModule 

ルータマクロ

は、私が2列挙型を持っています

iはこのフローを期待:

  • RouterInit(CH0、PARAM)=>
  • GetModule(CH0)## _初期化(パラメータ)=>
  • CH0_Module ## _初期化(パラメータ)=>
  • AModule ## _初期化(パラメータ)=>
  • AModule_Init(パラメータ)=>
  • ExternalInitFunction(PARAM)

私はエラーが発生します:は ";"

+0

ほとんどのコンパイラは、前処理後に停止し、前処理ファイルを生成するオプションがあります。あなたのマクロで本当に何ができるかを見るために、そうすることをお勧めします。 –

+1

'(channel ## _ Module)'を 'channel ## _ Module'に置き換えてください。 –

+1

プリプロセッサは2つのパスを行いません: '#define RouterInit(channel、param)channel ## _ Module ## _ Init(param)'を試してください –

答えて

4

プリプロセッサは2回のパスを実行できません。 1パスでRouterInitを定義してみませんか?そのスニペット(プラスあなたが宣言した他のもの)のgcc -E

#define RouterInit(channel,param) channel##_Module##_Init(param) 

int main() 
{  
    RouterInit(CH0,12); 
} 

結果:

int main() 
{  
    CH0_Module_Init(12); 
} 
+0

ありがとうございます。ヘッダーファイルのみでルーティングを行う方法を理解する必要があります。とにかく、プリプロセッサが2回のパスを実行できないことはわかりませんでした。単一のフェーズのように見えます。答えをありがとう –

関連する問題