【问题标题】:Assign value to struct array without function为没有函数的结构数组赋值
【发布时间】:2018-11-12 14:22:40
【问题描述】:

我目前正在使用设备管理器,但遇到了问题... 如图所示,我声明了一个结构数组,它应该保存设备的写入函数(vga,串行)......主要问题是我不想调用初始化函数,例如 vga_init() 或 serial_init()将它们分配给结构,这将失去意义......我想将这些函数存储在结构数组中,有没有一种方法可以在没有函数的情况下分配 vga_write/serial_write,如下所示(注意两个 cmets)?

感谢您的建议!

/* 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) { ...

【问题讨论】:

  • @M.Aroosi 不,这不是真的。 vga 必须是要替换的单独单词,因此 vga_write 不会受到影响。
  • 宏替换将产生info[0] = { .wr = &vga_write }; // Won't work!,但看不到info[]数组。并且,函数 vga_write 在这一点上是未知的 - 它是接下来定义的。
  • 对不起,我不是故意写 info[] :P Info has been struct device_io *io[]; vga_write 和 serial_write 在顶部声明。问题是,如何在不调用分配它们的函数的情况下将这些函数分配给 io-struct
  • 喜欢,例如 io[vga] = { .wr = &vga_write };当它不在函数内时,它会抛出一个错误... Short 说,我想在没有函数的情况下初始化数组..

标签: c struct clang assign


【解决方案1】:

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

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

【讨论】:

  • 非常感谢!这正是我需要知道的,很棒的帮助! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 2022-10-13
  • 2019-10-30
  • 1970-01-01
相关资源
最近更新 更多