返回指向宏中某个值的指针?

时间:2010-06-08 09:07:42

标签: c macros c-preprocessor

是否可以编写一个具有类型和值作为其输入参数(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));

有可能实现吗?

4 个答案:

答案 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 intdouble complex之类的内容,否则令牌粘贴将无效。

交替使用

USE_TEMPLATE(type) val_to_ptr_##type

并致电

USE_TEMPLATE(int)(5);

无需担心参数评估

答案 3 :(得分:1)

使用malloc()的任何解决方案都会在您给出的示例中导致内存泄漏。但是,使用C99复合文字的这个简单解决方案不会:

#define MACRO(type, val) (&(type){val})