是否可以编写一个具有类型和值作为其输入参数(MACRO(type,value)
)的宏,并返回一个指向保存已提交的value
的位置的有效指针。
此宏应该像以下函数一样执行,但是以更通用的方式执行:
int *val_to_ptr(int val){
int *r = NULL;
r = nm_malloc(sizeof(*r));
*r = val;
return r;
}
nm_malloc()
是一个故障安全malloc。
宏用法应与此用法兼容:
printf("%d",*MACRO(int,5));
有可能实现吗?
答案 0 :(得分:4)
如果您使用的是gcc,则可以使用statement expressions:
#define MACRO(type,value) ({ type* t = nm_malloc(sizeof(*t)); *t = (value); t; })
答案 1 :(得分:3)
也许(未经测试):
#define ALLOC_AND_INIT(T, val) *(T*)malloc(sizeof(T))=(val)
用法
printf("%d\n", ALLOC_AND_INIT(int, 5)); // memory leak :)
答案 2 :(得分:2)
这是一个以c ++模板为模型的实现
#define DEFINE_TEMPLATE(type) \
type * val_to_ptr_##type(type val){\
type * ptr = NULL;\
ptr = nm_malloc(sizeof(*ptr));\
*ptr = val;\
return ptr;\
}
#define USE_TEMPLATE(type,val)\
val_to_ptr_##type(val)
DEFINE_TEMPLATE(int);
int main(){
printf("%d",*USE_TEMPLATE(int,5));
return 0;
}
您必须明确定义您正在使用它的类型,并且必须输入unsigned int
或double complex
之类的内容,否则令牌粘贴将无效。
交替使用
USE_TEMPLATE(type) val_to_ptr_##type
并致电
USE_TEMPLATE(int)(5);
无需担心参数评估
答案 3 :(得分:1)
使用malloc()
的任何解决方案都会在您给出的示例中导致内存泄漏。但是,使用C99复合文字的这个简单解决方案不会:
#define MACRO(type, val) (&(type){val})