在没有函数的情况下为struct array赋值

时间:2018-06-02 19:28:35

标签: c struct clang assign

我目前正在设备管理员但遇到问题...... 如图所示我声明了一个结构数组,它应该保存设备的编写器功能(vga,serial)...主要问题是我不想调用初始化函数,例如vga_init()或serial_init()将它们分配给结构,tbh会失去意义......相反我想将这些函数存储在struct数组中,有没有办法在没有函数的情况下分配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) { ...

1 个答案:

答案 0 :(得分:0)

在函数外部,您只能使用初始化表达式为全局(或静态或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, ... };

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