C中的宏生成宏?

我想让C预处理器为我生成宏(即,我只使用C99)。 我写了一个宏

#define make_macro(in)  

当我放

 make_macro(name1) make_macro(name2) 

稍后在代码中,它将扩展为

 #define name1(...) name1_fn(name1_info, __VA_ARGS__) #define name2(...) name2_fn(name2_info, __VA_ARGS__) 

然后我就可以使用name1和name2作为(宏实现的)函数。 我认为我在两个步骤中都使用了宏:使用宏来重复填充模板是有意义的,并且除了通过宏之外,可变参数处理将不起作用。

那么占位符是做什么的呢? 在这一点上,我开始相信它在C99中是不可能的,但也许我错过了语法的一些细节。

在标准C中不可能。

你考虑过使用M4宏吗? 我认为它们在大多数平台上都可用,因此不应该是限制。

M4 GNU页面

这是不可能的,因为宏只完成一次。

这并不意味着您无法在宏中使用其他宏,但您无法做到

 #define TEST #define HALLO 33 int x = TEST; 

并期望x之后是33! 您会得到的是语法错误,因为您尝试过

 int x = #define HALLO 33; 

或许编译器已经在#define中抱怨#define。

正如大家所说,你不能完全按照你的要求去做。

您可以通过强制C预处理器运行两次来执行类似的操作,例如,在makefile中使用如下规则:

 .c.pp: $(CPP) $< -o $@ 

然后为您的文件提供test.pp的扩展名。 Makefile将运行一次以生成.c文件,然后.c文件上的正常运行将再次运行它。

就个人而言,我宁愿在Perl中编写一个外部脚本,也不想为我生成C代码; 它比使用C预处理器玩游戏更清洁。 这取决于我们谈论的代码量。

尝试#define make_macro(name,...) name##_fn(name##_info, __VA_ARGS__)

使用这样:

 make_macro(name1) make_macro(name2,1) 

这会产生

 name1_fn(name1_info) name2_fn(name2_info,1) 

根据C99第6.10.3.2节 :

类似函数的宏的替换列表中的每个#preprocessing token都应该跟一个参数作为替换列表中的下一个预处理标记。

所以,如果你有一个名为define的参数,你当然可以在一个宏中放一个#define ,但它永远不会做你想要的。 这经常让我烦恼,因为我必须在C中工作,因此不能使用C ++模板。