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 类型就无法表达函数指针。
我有一个函数(特别是系统调用)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 数组之一一样。
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 类型就无法表达函数指针。