gpt4 book ai didi

c - 使用#define 创建与 C89 std 兼容的虚拟记录

转载 作者:行者123 更新时间:2023-11-30 16:30:18 26 4
gpt4 key购买 nike

如何使用#define 根据 C89 标准创建虚拟记录?我尝试过:

    typedef struct foo{int a; int b;}foo;
#define DUMMY (foo) {.a=0, .b=0}

它工作得很好,但是当我使用 -std=c89 编译时,它给了我很多警告。警告说这种东西只兼容C99标准。谢谢大家!!

最佳答案

在 C89 中,可以在函数中使用的聚合(结构/union )类型的唯一值是命名对象、函数返回值、取消引用的指针或其他聚合的成员。虽然 C 包含一个构造,它定义了一个用常量数据初始化的字符数组,并将其生成为左值 [即字符串文字],任何其他类型都没有等效项。

如上所述,如果您可以创建命名静态对象,则可以使用:

static struct foo const doubleZero = {0,0};
#define DUMMY doubleZero

宏的使用与使用#ifdef DUMMY来确定它是否已被定义的代码兼容。

如果您需要能够根据可能变化的参数创建对象,则可以使用以下内容:

struct fooWrapper { struct foo dat[1]; };
struct fooWrapper makeFoo(int a, int b)
{ struct fooWrapper result; result[0].a=a; result[0].b=b; return result; }
#define MAKEFOO(a,b) (*(fooWrapper((a),(b)).dat))

这将允许代码将 MAKEFOO 的结果视为左值,从而允许例如

memcpy(whatever, &MAKEFOO(3,5), sizeof (struct foo));

返回的包装器对象的生命周期不会像 C 复合文字的生命周期那么长,但对于 C 复合文字的大多数用途来说应该足够了。

关于c - 使用#define 创建与 C89 std 兼容的虚拟记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51267107/

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