gpt4 book ai didi

c - 在 C99 中,我可以在不先将其分配给变量的情况下使用返回值吗?

转载 作者:太空宇宙 更新时间:2023-11-04 02:05:56 25 4
gpt4 key购买 nike

我正在用内联函数替换大型 C99 代码库中的宏,以查看编译器是否可以更好地优化工作。有很多扩展为数据结构的宏。代码不是将它们用作函数,而是用作数据结构本身的替代品。

例如……

#define AvARRAY(av)     ((av)->sv_u.svu_array)

AvARRAY(av)[--key] = &PL_sv_undef;

不仅有很多代码可以做到这一点,我控制之外的已发布代码也可以做到这一点,所以如果可能的话,我宁愿保留这个成语。

有没有办法定义与上述代码兼容的 AvARRAY 的内联函数版本?

最佳答案

是的,您可以使用返回值而不将其分配给变量。

但是,在一般情况下,无法用函数替换此宏。为此目的使用宏的全部意义在于宏可以“评估”为左值。不幸的是,C 中的函数不能产生左值。换句话说,不,在一般情况下你不能直接用函数替换这样的宏。

但在特定情况下可能会有所不同。他们真的将这些宏用作左值吗?在您的具体示例中,它不用作左值,因此在您的情况下您可以这样做

inline whatever_type_it_has *AvARRAY(struct_type *av)
{
return av->sv_u.svu_array;
}

并在以后完全按照您的示例中使用的方式使用它

AvARRAY(av)[--key] = &PL_sv_undef;

但是如果在代码的其他地方你有类似的东西

AvARRAY(av) = malloc(some_size);

whatever_type_it_has **pptr = &AvARRAY(av);

那你就倒霉了。函数版本将不起作用,而原始宏将起作用。

在这种情况下,用函数 [几乎] 完全“模拟”宏功能的唯一方法是将其提升到更高的间接级别,即假设函数总是返回一个指针 到目标数据字段

inline whatever_type_it_has **AvARRAY_P(struct_type *av)
{
return &av->sv_u.svu_array;
}

在那种情况下,你必须记住每次都取消引用该指针

(*(AvARRAY_P(av))[--key] = &PL_sv_undef;

但这会起作用

*AvARRAY_P(av) = malloc(some_size);
whatever_type_it_has **pptr = &*AvARRAY_P(av);

但这不适用于位域,而宏版本可以。

关于c - 在 C99 中,我可以在不先将其分配给变量的情况下使用返回值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20574754/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com