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

发布于 2024-09-05 06:20:34 字数 400 浏览 1 评论 0原文

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

是否可以实现?

Is it possible to write a macro that has a type and a value as its input parameters (MACRO(type,value)), and returns a valid pointer to a location that holds the submitted value.

This macro should perform like the following function, but in a more generic manner:

int *val_to_ptr(int val){
    int *r = NULL;
    r = nm_malloc(sizeof(*r));
    *r = val;
    return r;
}

Where nm_malloc() is a failsafe malloc.
The Macro usage should be compatible with this usage:

printf("%d",*MACRO(int,5));

Is it possible to achieve that ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

記憶穿過時間隧道 2024-09-12 06:20:34

如果您使用的是 gcc,则可以使用语句表达式

#define MACRO(type,value) ({ type* t = nm_malloc(sizeof(*t)); *t = (value); t; })

If you're using gcc, you can use statement expressions:

#define MACRO(type,value) ({ type* t = nm_malloc(sizeof(*t)); *t = (value); t; })
南街女流氓 2024-09-12 06:20:34

也许(未经测试):

#define ALLOC_AND_INIT(T, val) *(T*)malloc(sizeof(T))=(val)

用法

printf("%d\n", ALLOC_AND_INIT(int, 5));  // memory leak :)

Perhaps (untested):

#define ALLOC_AND_INIT(T, val) *(T*)malloc(sizeof(T))=(val)

Usage

printf("%d\n", ALLOC_AND_INIT(int, 5));  // memory leak :)
冷︶言冷语的世界 2024-09-12 06:20:34

这是一个以 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);

,而不必担心参数评估

Here's an implementation which is modelled on c++ templates

#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;
}

You'd have to explicitly define what types you're using it for, and would have to typedef things like unsigned int or double complex or the token paste won't work.

Alternately use

USE_TEMPLATE(type) val_to_ptr_##type

and call

USE_TEMPLATE(int)(5);

without having to worry about argument evaluation

伴我心暖 2024-09-12 06:20:34

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

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

Any of the solutions using malloc() will cause a memory leak in the example you gave. However, this simple solution, using C99 compound literals, does not:

#define MACRO(type, val) (&(type){val})
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文