Tag: struct

C类结构中自动字段重新排序的方法

有没有办法在C-like结构中执行自动字段重新排序 ? 我的意思是使用语言function(如C和C ++的预处理器和C ++的模板/类型特征/等),这使得可以执行以下宏(类似Boost.Fusion的样式来适应结构): REARRANGE(StructureName, (int8_t)(FieldName1), (int32_t)(FieldName2), (int16_t)(FieldName3), (int32_t)(FieldName4)); // is equivalent to (without loss of generality): struct StructureName { int32_t FieldName2; int32_t FieldName4; int16_t FieldName3; int8_t FieldName1; }; 当然,方法应考虑alignof值(以及sizeof ),如果可能,还应考虑#pragma pack current value。 我知道结果的可移植性差,但仅供本地使用。 将字段名称与各个类型一起保存是强制性的。 目的是减少总体结构尺寸。

C联合和多态

可能重复: 如何在C中模拟OO风格的多态? 我正在尝试使用联合在C中创建多态性。我执行以下操作。 typedef struct{ … … } A; typedef struct{ … … } B; typedef union{ A a; B b; }C; 我的问题是:我怎么能有一个类型为C的方法,但也允许A和B. 我希望以下工作: 如果我定义一个函数: myMethod(C){ … } 那么,我希望这个工作: main(){ A myA; myMethod(myA); } 它没有。 有什么建议?

通过展开inheritance是否违反了严格的别名规则?

我有一个inheritance自struct Base的struct X. 但是,在我目前的设置中,由于对齐,X的大小为24B: typedef struct { double_t a; int8_t b; } Base; typedef struct { Base base; int8_t c; } X; 为了节省内存,我想展开Base结构,所以我创建了包含Base的字段的struct Y(以相同的顺序,总是在struct的开头),所以struct的大小是16B : typedef struct { double_t base_a; int8_t base_b; int8_t c; } Y; 然后我将在一个方法中使用struct Y的实例,该方法需要一个指向Base结构的指针: void print_base(Base* b) { printf(“%f %d\n”, b->a, b->b); } // … Y data; print_base((Base*)&data); 上面的代码是否违反了严格的别名规则,并导致未定义的行为?

从未定义结构

在C中使用未定义的结构有什么好处吗? SQLite源代码中的示例: /* struct sqlite3_stmt is never defined */ typedef struct sqlite3_stmt sqlite3_stmt; 对象被操纵如下: typedef struct Vdbe Vdbe; struct Vdbe { /* lots of members */ }; int sqlite3_step(sqlite3_stmt *pStmt) { Vdbe *v = (Vdbe*) pStmt; /* do stuff with v… */ } 那么为什么不使用通常的抽象类型,在foo.c源中私有定义的实际结构和foo.h头中的公共typedef ?

C中“union”和“struct”之间的主要区别是什么?

可能重复: C中结构与联盟的区别 我能理解结构意味着什么。 但是,我对union和struct之间的区别感到困惑。 联盟就像是记忆的一部分。 究竟是什么意思。

在C中创建和理解结构的链接列表

我无法一起掌握struct和链表数据结构的概念。 例如,假设我们有这样的代码:一个具有worker的内容的struct ,这些struct的链表包含每个worker的节点和指向下一个节点的指针(?)。 typedef struct Schedule { char name[10]; char description[10]; int hours; int workordernum; } Work; typedef struct linkedlist { struct Schedule work; struct linkedlist *next; } Node; 问题是如何创建一个始终在列表开头添加节点的方法,一种使用用户定义的workordernum将其添加到列表中任何位置(中间)的方法,以及始终将其添加到最后的方法。 我不太了解->和*正确使用。 我确实在网上阅读了有关创建头部和尾部节点的信息,但我没有正确使用它,因为它们有一个列表struct和一个节点struct 。 我没有得到的另一件事是,假设在列表的开头添加一个节点,你如何改变以前所有节点的每个workordernum值呢? 我理解每次添加,删除或移动节点时都必须跟踪,这意味着每次调用这些方法时,我们必须有一个跟踪数字的变量。 因此,如果列表中的节点都已准备就绪,其顺序为1,那么我们在开头添加另一个节点,如何将订单号1更改为2,将1添加到1? 或者如果我们只有一个指针,node-> next-> next-> next怎么工作? 然后我们将如何打印所有这些? 因为我们不能使用for循环。 所以这些是我无法把握代码的概念。 如果你花时间解释它,而不是仅仅给出代码,如果可能的话,我会非常感激。 因为我必须应用我学到的东西来移动并删除节点。 我想自己学习。 如果必须给出一些代码示例,那就没关系,但请不要为我发布所有答案代码。 -谢谢 *请原谅任何格式错误,因为我是这个网站的新手。 编辑:我确实理解指针是一个地址,并且->属于“指向”一个成员。 我的意思是我理解所有基础知识,但我的理解不够坚定,否则我可以做我需要帮助的事情。 编辑2:我将尝试使用我目前学到的链接列表创建一个头节点。 我将使用上面的结构,它将是松散的代码,而不是完美的。 这只是为了确保我到目前为止在正确的轨道上。 int […]

C中的数据封装

我目前正在研究一个嵌入式系统,我在电路板上有一个组件,它出现了两次。 我想为组件提供一个.c和一个.h文件。 我有以下代码: typedef struct { uint32_t pin_reset; uint32_t pin_drdy; uint32_t pin_start; volatile avr32_spi_t *spi_module; uint8_t cs_id; } ads1248_options_t; 这些都是硬件设置。 我创建了这个结构的两个实例(每个部分一个)。 现在我需要在后台保留一组值。 例如,我可以每秒从该设备读取值,并且我想保留最后100个值。 我希望这些数据不能从我的组件的“外部”访问(仅通过我的组件中的特殊function)。 我不确定如何在这里继续。 我真的需要将数组作为结构的一部分吗? 我想到的是做以下事情: int32_t *adc_values; // <– Add this to struct int32_t *adc_value_buffer = malloc(sizeof(int32_t) * 100); // <– Call in initialize function, this will never be freed on purpose 然而,我将能够从我的代码中的任何地方(也来自我的组件外部)访问我的int32_t指针,这是我不喜欢的。 […]

C中的静态结构初始化

我有一个结构类型,如下所示: typedef struct position{ float X; float Y; float Z; float A; } position; typedef struct move{ position initial_position; double feedrate; long speed; int g_code; } move; 我试图静态初始化它,但我还没有找到办法。 这可能吗?

C11匿名结构通过typedef?

C11标准中添加了匿名结构,所以 typedef struct { struct {int a, b}; int c; } abc_struct; 是有效和标准的。 使用typedef代替完整的struct声明是否也在标准范围内? 例如: typedef struct { int a, b; } ab_struct; typedef struct { ab_struct; int c; } abc_struct; GCC文档说这是Plan 9扩展,但它在我尝试过的少数编译器中工作(包括GCC ……)。 通过我对标准本身的阅读,我认为没关系,但这是一种容易搞砸的近距离阅读。

动态分配结构中的结构

我正在动态分配一个结构,该结构具有不同的结构作为成员: struct a { // other members struct b; } struct b基本上包含指向另一个struct b的指针,因此将struct b视为链表。 如果我动态分配struct a ,那么它也会在其中生成一个新的struct b 。 但是,执行该操作或使struct a具有指向struct b的指针,并在struct a动态分配struct b之间的区别是什么? 实施有什么区别?