gpt4 book ai didi

c - 如何处理c中的结构?

转载 作者:行者123 更新时间:2023-12-05 06:56:36 25 4
gpt4 key购买 nike

我正在学习如何在 c 中制作简单的 sqlite 克隆的教程,该教程提到构建一个名为 Row 的结构,其定义如下:

typedef struct 
{
int id;
char name[COLUMN_USERNAME_SIZE];
char email[COLUMN_EMAIL_SIZE];
}Row;

它被定义了一个预处理器宏来获取该结构成员的大小,但我无法理解它的定义。它的定义如下:

#define size_of_attribute(Struct, Attribute) sizeof(((Struct*)0)->Attribute) 

那么,本教程在这里使用结构名称而不是它的对象是什么意思,为什么要使用 * 运算符,最重要的是,这里的 0 是什么意思?

最佳答案

您可以通过两种方式使用sizeof:使用数据类型或数据对象。

给定这样一个变量,您可以使用两个版本:

Row oneRow;

size_t size1 = sizeof (Row);
size_t size2 = sizeof (oneRow);

如果您想获取类型中特定字段的大小,您只能在需要对象的地方使用第二个变体。

size_t size3 = sizeof (oneRow.name);

Row *pRow = &oneRow;
size_t size4 = sizeof (pRow->name);

这是宏的用武之地。它避免了提供现有数据对象的需要。

sizeof(((Struct*)0)->Attribute) 

这采用地址 0 并将其解释为指向 Struct 的指针。这类似于我的最后一个例子。然后它指定字段以获取我们想要大小的对象。

如果你将它与你的类型一起使用,这就是你得到的:

size_t size = size_of_attribute(Row, name);

预处理器完成处理后,您将得到:

size_t size = sizeof(((Row*)0)->name);

这类似于

Row *pRow = NULL;
size_t size = sizeof(pRow->name;

注意:这看起来像是取消引用一个 NULL 指针,但事实并非如此。 sizeof 不访问数据对象,而仅评估其大小。此处未进行读取访问。

关于c - 如何处理c中的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65091461/

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