为没有函数的结构数组赋值
Assign value to struct array without function
我目前正在使用设备管理器,但遇到了问题...
如图所示,我声明了一个结构数组,该数组应该包含设备(vga,串行)的编写器功能......主要问题是我不想调用初始化函数,例如 vga_init()或 serial_init() 将它们分配给结构,tbh 这将失去意义......我想将这些函数存储在结构数组中,有没有办法在没有函数的情况下分配 vga_write/serial_write,如下图所示(注意两条评论)?
感谢您的指教!
/* device.h */
#define vga 0
#define serial 1
/* device info structure */
struct device_io {
void (*write)(const char *str);
}
extern struct device_io *io[];
/* vga.c */
io[vga] = { .wr = &vga_write }; // Won't work!
void vga_write(const char *str) { ...
/* serial.c */
io[serial] = { .wr = &serial_write }; // Won't work also!
void serial_write(const char *str) { ...
在函数之外,您只能使用初始化表达式为全局(或静态或 bss)变量赋值。
这反过来意味着您正在使用的初始化表达式必须立即初始化整个数组,如下所示:
static int test[] = { 4, 5, 6 };
,当然可以扩展到函数指针或结构等任意数据
void some_func0(const char *v) { }
void some_func1(const char *v) { }
static void (*test[])(const char *) = { &some_func0, &some_func1 };
。正如您所看到的,这要求您打算使用的所有函数至少在初始化程序之前 声明 。在你的问题中声明数组时(在 "device.h" 中)我假设你不知道所有的实现。
但是,您需要在程序中的某处有一个源文件,您可以在其中同时了解所有数组元素。要解决此问题,您可以像这样重构代码:
device.h
extern void (*test[])(const char *); // <-- or your struct type
vga.h
extern void vga_write(const char *);
vga.c
void vga_write(const char *c) {...
device_array_initialization_helper_this_is_a_very_verbose_file_name.c
#include "device.h"
#include "vga.h"
// Definition of the array, which is declared in device.h
void (*test[])(const char *) = { &vga_write, ... };
当然,你也可以使用你的结构类型。
我目前正在使用设备管理器,但遇到了问题... 如图所示,我声明了一个结构数组,该数组应该包含设备(vga,串行)的编写器功能......主要问题是我不想调用初始化函数,例如 vga_init()或 serial_init() 将它们分配给结构,tbh 这将失去意义......我想将这些函数存储在结构数组中,有没有办法在没有函数的情况下分配 vga_write/serial_write,如下图所示(注意两条评论)?
感谢您的指教!
/* device.h */
#define vga 0
#define serial 1
/* device info structure */
struct device_io {
void (*write)(const char *str);
}
extern struct device_io *io[];
/* vga.c */
io[vga] = { .wr = &vga_write }; // Won't work!
void vga_write(const char *str) { ...
/* serial.c */
io[serial] = { .wr = &serial_write }; // Won't work also!
void serial_write(const char *str) { ...
在函数之外,您只能使用初始化表达式为全局(或静态或 bss)变量赋值。
这反过来意味着您正在使用的初始化表达式必须立即初始化整个数组,如下所示:
static int test[] = { 4, 5, 6 };
,当然可以扩展到函数指针或结构等任意数据
void some_func0(const char *v) { }
void some_func1(const char *v) { }
static void (*test[])(const char *) = { &some_func0, &some_func1 };
。正如您所看到的,这要求您打算使用的所有函数至少在初始化程序之前 声明 。在你的问题中声明数组时(在 "device.h" 中)我假设你不知道所有的实现。
但是,您需要在程序中的某处有一个源文件,您可以在其中同时了解所有数组元素。要解决此问题,您可以像这样重构代码:
device.h
extern void (*test[])(const char *); // <-- or your struct type
vga.h
extern void vga_write(const char *);
vga.c
void vga_write(const char *c) {...
device_array_initialization_helper_this_is_a_very_verbose_file_name.c
#include "device.h"
#include "vga.h"
// Definition of the array, which is declared in device.h
void (*test[])(const char *) = { &vga_write, ... };
当然,你也可以使用你的结构类型。