gpt4 book ai didi

c - 不使用函数为结构体数组赋值

转载 作者:行者123 更新时间:2023-11-30 16:31:22 24 4
gpt4 key购买 nike

我目前正在开发设备管理器,但遇到了问题...如图所示,我声明了一个结构数组,该数组应该保存设备(vga、串行)的写入函数...主要问题是我不想调用初始化函数,例如 vga_init() 或 serial_init()将它们分配给结构,说实话,这会失去意义...相反,我想将这些函数存储在结构数组中,有没有一种方法可以在没有函数的情况下分配 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”中),我认为您不知道所有实现。

但是,您需要在程序中的某个位置有一个源文件,您可以在其中立即知道所有数组元素。要解决此问题,您可以重构代码,如下所示:

<小时/>

设备.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, ... };
<小时/>

当然,您也可以使用您的结构类型。

关于c - 不使用函数为结构体数组赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50660422/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com