我正在 MSVC 中编写设备驱动程序。作为设计的一部分,我希望拥有不同的模块,但让这些模块在某种程度上彼此隔离,以便它们在未来可以互换。我的设计具有以下声明的结构
typedef struct tagMODULE_INTERFACE {
NTSTATUS (*initialize)(GLOBAL_DATA *pGD);
NTSTATUS (*shutdown)(void);
NTSTATUS (*sendResponse)(PVOID outBuf, ULONG outBufSz, PULONG outBufLen);
} MODULE_INTERFACE, *PMODULE_INTERFACE;
在主 .c 文件中,我有要在安装时加载的主要模块数组。它是这样定义的:
MODULE_INTERFACE modules[2] =
{
Module1,
{NULL, NULL, NULL}// terminal entry
};
在我的 module1.c 文件中,我公开了以下内容:
CONST MODULE_INTERFACE Module1 = {initializeModule1, shutdownModule1, sendModule1Response};
在我的 module1.h 文件中,我有:
extern CONST MODULE_INTERFACE Module1;
这里的想法是我不必在 module1.c 之外声明 initializeModule1、shutdownModule1 和 sendModule1Response 函数,但 main.c 将有一个函数指针数组,用于在必要时进行初始化、关闭和回调。
我的问题是模块中的 Module1 条目出现 C2099“初始化不是常量”错误,而 {NULL, NULL, NULL} 条目出现 C2078“初始化器太多”。
我在这里想念什么?我原本以为,如果我确保 module1.c 在 main.c 之前编译,它将解决第一个问题,但事实并非如此。
任何帮助将不胜感激。