Tag: struct

返回寄存器中的结构 – GCC中的ARM ABI

在ARM ABI文档中,我遇到了如下定义的函数: __value_in_regs struct bar foo(int a, int b) { … } 但是GCC( 4.3.3 )不允许它,我能找到的只是对一些RealView编译器的引用。 从GCC有没有办法做到这一点? 我已经尝试过-freg-struct-return但它并没有什么区别。 因为它是一个ABI我无法改变原始程序,并返回一个常规结构破坏堆栈。 如果可以避免,我宁愿不使用组件,因为它没有必要。 谢谢!

C中的力特定结构尺寸

由于各种原因,我有一些结构我想强制为特定大小(在这种情况下为64字节和512字节)。 然而,两者都低于我希望它们的尺寸。 反正我是否告诉编译器将它们设置为这些特定的大小并用零填充,或者我最好只是在结构中声明构成多余空间的数组,以便它与我想要的大小对齐?

简单的结构inheritance和伪多态与vs严格别名

如果有人回答我的问题,请不要告诉我使用C ++ 。 所以,我在C中创建了一个使用面向对象方法的小型库。 我选择在C中使用两种主要的inheritance方法中较不常见的方法:将基类型的成员复制到派生类型的开头。 像这样的东西: struct base { int a; int b; char c; }; struct derived { int a; int b; char c; unsigned int d; void (*virtual_method)(int, char); }; 这种方法不如另一种方法(基类型的实例作为派生类型的第一个成员)受欢迎,因为 从技术上讲,没有标准保证基础和派生结构的第一个共同成员将具有相同的抵消。 但是,除了其中一个结构被打包而另一个结构没有被打包的情况之外,它们将在大多数(如果不是全部)已知编译器上具有相同的偏移量。 这种方法最严重的缺陷:它违反了严格的别名 。 将指向派生结构的指针转换为其基类型然后解除引用指针在技术上是未定义的行为。 但是,与其他方法相比,它也有其优点: 更少详细:访问已inheritance的派生结构的成员与访问尚未inheritance的结构相同,而不是转换为基类型, 然后访问所需的成员; 这实际上是真正的inheritance而不是构成 ; 虽然可能需要一些预处理器滥用,但它与其他方法一样容易实现; 我们可以得到一个实际多重inheritance的半生不熟的forms,我们可以从几个基类型inheritance,但只能转换为其中一个。 我一直在寻找使我的库编译和使用强制执行严格别名(如gcc )的编译器正确工作的可能性,而无需用户手动关闭它。 以下是我研究过的可能性: 工会。 遗憾的是,由于以下几个原因,这些是禁忌: 详细程度回归! 要遵循通过联合访问2个结构的第一个共同成员的标准规则,必须(从C99开始)明确使用联合来访问第一个共同成员。 我们需要特殊的语法来访问联合中每种类型的成员! 空间。 考虑一个inheritance层次结构。 […]

我们可以有一个可变长度数组类型的struct元素吗?

我们可以声明一个可变长度的结构元素吗? 条件如下: typedef struct { uint8_t No_Of_Employees; uint8_t Employee_Names[No_Of_Employees][15]; }st_employees;

在C中使用前向声明的typedef stuct

我有类似的东西: typedef struct Data DATA, *DATA_PTR; typedef struct Units UNITS, *UNITS_PTR; struct Data { double miscData; UNITS units; }; struct Units { double x[2]; double y[2]; double z[2]; }; 在我的project_typedef.h文件中。 在另一个文件中,我有类似的东西: void fileInput(DATA_PTR data) { //usual declarations and other things data->miscData = 0; //Works! data->units.x[0] = 5; //Doesn’t work //etc… } 但是,这不起作用,因为单元是在project_typedef.h数据之后声明的(如果我切换它的工作顺序)。 我得到的错误是“左’.x’必须有struct / union类型”。 […]

如何在struct中正确定义一个函数指针,它将struct作为指针?

我有一个带回调函数的结构,回调函数需要一个指向结构的指针才能进行操作。 如何正确定义这些元素,以便在没有警告的情况下进行编译? typedef struct { // some fields required for processing… int (*doAction)(struct pr_PendingResponseItem *pr); } pr_PendingResponseItem; 如果我删除pr参数上的“struct”属性,我会收到错误。 如果我留下它,我会收到一个警告:“它的范围只是这个定义或声明,这可能不是你想要的” 这一切都有效,但我想知道定义这种结构的正确方法。 另外相关的是定义一个自引用结构: typedef struct LinkedItem_ { LinkedItem_ * prev; LinkedItem_ * next; void * data; } LinkedItem; (我认为这是正确的,但如果与问题相关,则欢迎其他想法。)

何时复制填充字节 – 结构赋值,按值传递,其他?

在调试问题时,出现了以下问题。 (请忽略次要代码错误;代码仅供参考。) 定义了以下结构: typedef struct box_t { uint32_t x; uint16_t y; } box_t; 这个结构的实例正在通过函数的值传递(显然简化): void fun_a(box_t b) { … use b … } void fun_b(box_t bb) { // pass bb by value int err = funa(bb); } void fun_c(void) { box_t real_b; box_t some_b[10]; … … use real_b and some_b[] … … funb(real_b); funb(some_b[3]); … […]

转发在Objective-C中声明一个结构

我正在创建一个协议,我正在定义的方法的一个参数是CMTime* 。 我想转发声明CMTime而不是包含它。 但是,我尝试过@class CMTime并且它抱怨它在别处重新定义为不同类型的符号。 文档说这是一个结构。 我已经尝试将其声明为 struct CMTime; 但它仍在抱怨它不知道它是什么。 我有什么想法我做错了吗?

使用char数组进行C struct初始化

我有一个C结构定义如下: struct Guest { int age; char name[20]; }; 当我创建一个Guest变量并使用以下内容对其进行初始化时: int guest_age = 30; char guest_name[20] = “Mike”; struct Guest mike = {guest_age, guest_name}; 我得到了关于第二个参数初始化的错误,它告诉我guest_name不能用于初始化成员变量char name[20] 。 我可以这样做来初始化所有: struct Guest mike = {guest_age, “Mike”}; 但这不是我想要的。 我想按变量初始化所有字段。 如何在C中执行此操作?

c typedef(ed)opaque指针

我已经定义了一个不透明的结构和相关的API,如下所示: typedef struct foo foo; foo *create_foo(…); delete_foo(foo *f); 我无法在我的c文件中定义结构。 给出重新定义错误。 typedef struct foo { int implementation; }foo; 我可以在没有typedef的c文件中使用foo,但我想要typedef(即直接使用它作为foo *)。 有办法吗?