相关疑难解决方法(0)

C/C++结构偏移量

我正在寻找一段代码,可以告诉我结构中字段的偏移而不分配结构的实例.

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 c++ oop

36
推荐指数
2
解决办法
4万
查看次数

在C中,指向结构的指针总是指向其第一个成员吗?

假设我有许多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)

在示例中,您将注意到两个结构FooBarBase成员开头.

而且,在MethodOperatesOnBase那里,我将void *参数转换为Base *.

我想传递指针Bar和指向Foo此方法的指针,并依赖结构的第一个成员作为Base结构.

这是可以接受的,还是有一些(可能是编译器特定的)问题需要注意?(比如某种类型的打包/填充方案会改变结构的第一个成员的位置?)

c

32
推荐指数
1
解决办法
2万
查看次数

Libev,如何将参数传递给相关的回调

我陷入了在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?我们必须承担全球变量的负担和丑陋吗?

c callback libev

23
推荐指数
1
解决办法
4063
查看次数

使用基本结构从void *提取值

我的项目中有许多类型的结构,另一个结构包含指向这些结构之一的指针。如,

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)

c struct

5
推荐指数
1
解决办法
108
查看次数

标签 统计

c ×4

c++ ×1

callback ×1

libev ×1

oop ×1

struct ×1