C在当前宏块中使用定义的宏

C在当前宏块中使用定义的宏,c,macros,C,Macros,我正在使用宏在C中实现一个通用哈希表 例如,我将键、值类型定义为 #define h_key_type int #define h_val_type int 然后我将put函数定义为: #define H_PUT(key_type, val_type) \ void key_type##_put(...) H_PUT(h_key_type, h_val_type); 然而,经过预处理的源代码变得 void h_key_type_put(...) 甚至我也

我正在使用宏在C中实现一个通用哈希表

例如,我将键、值类型定义为

#define h_key_type int 
#define h_val_type int
然后我将put函数定义为:

#define H_PUT(key_type, val_type) \
                void key_type##_put(...)

H_PUT(h_key_type, h_val_type);
然而,经过预处理的源代码变得

void h_key_type_put(...)
甚至我也将函数声明更改为:

#define H_PUT() \
           void h_key_type##_put(...)
它仍然被替换为:

 void h_key_type_put(...)
所以我必须使用

#define H_PUT(key_type, val_type) \
                void key_type##_put(...)

H_PUT(int, int)
让它工作

但这并不方便,因为我要么必须引入一个巨大的define块,要么必须为每个函数键入键、值类型,这并不优雅


有什么想法吗?

没有建议的“重复”解决方案不起作用。通过使用str(s)#s,s的标记变为“4”,给定#define foo 4,xstr(foo)。显然,“int”\u put无效。您看到的是错误的副本。关于C++中的精化的一个明显的(在我的头脑中)不相关,但是我不能撤销它被建议的事实。您需要令牌连接,这是另一个问题。
定义H#u PUT(key,val)H#u EXPANDED#u PUT(key,val)
定义H#u EXPANDED#u PUT(key#u type,val#u type)无效key#u PUT(…)
,然后
H#u PUT(H#u key,val#u type)(连同问题的前两行定义)。当然,在C语言中,不能有一个只以省略号
作为参数的函数;必须至少有一个固定参数。如果你在C++中编码,你应该使用模板,而不是宏来生成函数。我认为是这样的。