我正在寻找一段代码,可以告诉我结构中字段的偏移而不分配结构的实例.
IE:给定
struct mstct {
int myfield;
int myfield2;
};
Run Code Online (Sandbox Code Playgroud)
我可以写:
mstct thing;
printf("offset %lu\n", (unsigned long)(&thing.myfield2 - &thing));
Run Code Online (Sandbox Code Playgroud)
获得offset 4
输出.如果没有mstct thing
声明/分配一个怎么办呢?
我知道&<struct>
并不总是指向结构的第一个字段的第一个字节,我可以在以后解释.
假设我有许多C结构,我想要一组特定的函数来操作.
我想知道以下是否是合法的方法:
typedef struct Base {
int exampleMember;
// ...
} Base;
typedef struct Foo {
Base base;
// ...
} Foo;
typedef struct Bar {
Base base;
// ...
} Bar;
void MethodOperatesOnBase(void *);
void MethodOperatesOnBase(void * obj)
{
Base * base = obj;
base->exampleMember++;
}
Run Code Online (Sandbox Code Playgroud)
在示例中,您将注意到两个结构Foo
并Bar
以Base
成员开头.
而且,在MethodOperatesOnBase
那里,我将void *
参数转换为Base *
.
我想传递指针Bar
和指向Foo
此方法的指针,并依赖结构的第一个成员作为Base
结构.
这是可以接受的,还是有一些(可能是编译器特定的)问题需要注意?(比如某种类型的打包/填充方案会改变结构的第一个成员的位置?)
我陷入了在libev中传递争论的局面.
通常,libev在类似*receive_callback*的函数中接收包,这没关系,但实际上,我们需要根据收到的包调度相对*write_callback*来处理特定的作业.例如:
S_RECV_MSG* pstRecvMsg = (S_RECV_MSG*) recv_buff;
switch(pstRecvMsg->wMsgType) {
case 1:
ev_io_init(w, write_callback1, w->fd, EV_WRITE);
break;
case 2:
ev_io_init(w, write_callback2, w->fd, EV_WRITE);
break;
case 3:
// .......
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果write_callbackX
还必须读取recv_buff中的具体内容,我们如何将recv_buff参数传递给callbackX?我们必须承担全球变量的负担和丑陋吗?
我的项目中有许多类型的结构,另一个结构包含指向这些结构之一的指针。如,
struct one{int num = 1;};
struct two{int num = 2;};
struct three{int num = 3;};
// These structs hold many other values as well, but the first value is always `int num`.
Run Code Online (Sandbox Code Playgroud)
我还有另一个结构,其中包含对这些结构的引用。我不得不使用,void*
因为我不知道将要引用这些结构中的哪个。
struct Holder{void* any_struct};
Run Code Online (Sandbox Code Playgroud)
我的问题是,我需要这些结构中的值,但是我有一个void
指针,能否将第一个变量声明为一个基本结构,将其int
强制转换,然后使用它num
从这些结构中提取变量,例如:
struct Base{int num};
((Base*) Holder->any_struct)->num
// Gives 1, 2 or 3
Run Code Online (Sandbox Code Playgroud)