簡體   English   中英

使用 peprocessor 宏來生成函數調用

[英]use peprocessor macros to generate function calls

我有一些特定的函數原型

void init_channel_0(void);
void init_channel_1(void);
void init_channel_2(void);
void init_channel_3(void);
void init_channel_4(void);
void init_channel_5(void);
void init_channel_6(void);
void init_channel_7(void);
void init_channel_8(void);
void init_channel_9(void);

我想在循環中調用這些函數:

#define CHANNEL_INIT(channel)  init_channel_##(#channel)

for (int i = 0; i < 10; i++) { 
   INIT_CHANNEL(i)
} 

我嘗試使用一些宏定義來做到這一點,但它沒有用 有沒有辦法做到這一點?

您不能將運行時值傳遞給預處理器。 使用數組。

typedef void channel_func_t (void);

...

channel_func_t*const CHANNEL_INIT [] =
{
  init_channel_0,
  init_channel_1,
  ..
};

...

for (int i = 0; i < 10; i++) { 
  CHANNEL_INIT[i]();
}

通常的做法是生成一些 C 代碼。

你會寫一些元程序(用 C 或PythonGuileLuaGNU gawk或任何你喜歡的腳本語言)生成一個文件_do_init_channel.inc包含

 /// generated _do_init_channel.inc
 init_channel_0();
 init_channel_1();

等等...

你會在適當的地方#include "do_init_channel.inc"

當然,相應地調整您的構建自動化(例如您的Makefile )。

通過倫丁答案是正確的,但如果init_channel_的k個函數是微小的,已知的,優化的編譯器可以很容易地內聯它們。

順便說一句,您可能會對現有的C 代碼生成器感興趣,例如GNU bisonSWIGRPCGEN

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM