C函数指针赋值警告

C function pointer assignment warning

我有一个函数(特别是系统调用)returns需要调用的函数的结果。

代码看起来像这样

    int32_t (*func_ptr)(int32_t fd, void * buf, int32_t nbytes);
    func_ptr = (curr_proc->fds[fd].operations_pointer[READ]);

我们的 curr_proc 只是一个结构。该结构包含一个文件描述符数组 (fds),其中包含指向 运行 (operations_pointer) 对应函数的指针。有一个数组保存我们系统中每种类型设备的功能,这个数组看起来像这样:

uint32_t * rtc_ops_table[4] = {(uint32_t *) rtc_open, (uint32_t *) rtc_read, (uint32_t *) rtc_write, (uint32_t *) rtc_close};
uint32_t * dir_ops_table[4] = {(uint32_t *) dir_open, (uint32_t *) dir_read, (uint32_t *) dir_write, (uint32_t *) dir_close};

因此,当程序调用 read 时,相应的函数指针被加载到 func_ptr 中,然后返回相应的参数。

我遇到的问题是,在我指定的行 func_ptr 中,我从 gcc 收到此警告:

warning: assignment makes pointer from integer without a cast

我已经尝试过各种类型转换,例如 (uint32_t *)(uint32_t)(int32_t) 等。我还尝试过这样分配函数指针:

func_ptr = &(curr_proc->fds[fd].operations_pointer[READ]);

但是没有用。

我该如何解决这个警告?

编辑:

这是 curr_prc

的结构
typedef struct {
    file_array fds[8];
    uint8_t file_names[8][32];
    uint8_t proc_num;
    ...
} pcb_t;

以及 fas 的结构:

typedef struct file_array{
    uint32_t * operations_pointer;
    inode_t * inode;
    uint32_t file_position;
    uint32_t flags;
} file_array;

尝试这样的事情(当然,将行放在代码中它们所属的位置):

typedef int32_t (*my_func_ptr)(int32_t fd, void * buf, int32_t nbytes);

typedef struct file_array{
    my_func_ptr operations_pointer[4];
    inode_t * inode;
    uint32_t file_position;
    uint32_t flags;
} file_array;

my_func_ptr rtc_ops_table[4] = {rtc_open, rtc_read, rtc_write, rtc_close};
my_func_ptr dir_ops_table[4] = {dir_open, dir_read, dir_write, dir_close};

my_func_ptr func_ptr = (curr_proc->fds[fd].operations_pointer[READ]);

在此示例中,my_func_ptr 是一种描述您的函数指针的类型,并用于包含它们的所有变量。

或者,您可能希望将 operations_pointer 声明为指针:

 my_func_ptr *operations_pointer;

这样您就可以让它指向您的两个操作表之一:

curr_proc->fds[fd].operations_pointer = rtc_ops_table;

那么您可以使用 operations_pointer 就好像它是 ops_table 数组之一一样。

file_array中的

operations_pointer应该是函数指针类型(func_ptr),是uint32_t指针!

函数指针和对象指针对于 C 是不同的。您不能直接在它们之间进行转换,除非您可以将函数指针转换为类型 void *,这是一种对象指针类型。

此外,如果 file_array.operations_pointer 的目的是指向函数指针的动态数组,那么您需要额外的间接级别。

也许您想要这样的东西:

typedef struct file_array{
    int (**operations_pointer)();
    inode_t * inode;
    uint32_t file_position;
    uint32_t flags;
} file_array;

operations_pointer 声明为指向接受未指定参数和 returning int 的函数的指针。这适用于动态分配的函数指针块。您的 C 编译器可能会在那里抱怨缺少函数原型,这是正确的:该形式不表达指向函数的参数类型,但如果这些函数不都具有兼容的签名,那是合适的。

如果您要存储的所有函数指针都指向具有相同签名的函数,那么最好在类型声明中表达该签名:

typedef struct file_array{
    int (**operations_pointer)(int32_t, void *, int32_t);
    inode_t * inode;
    uint32_t file_position;
    uint32_t flags;
} file_array;

如果它们不都具有相同的签名,那么它们至少必须具有相同的 return 类型,因为如果不指定 return 类型就无法表达函数指针。