我正在更新用C编写的DLL,几个小时前我遇到了问题。
除其他事项外,该项目还使用宏为DLL的模块(结构,“继承自Module”)生成通用功能。
这些宏适用于除一个模块(Hub)的一个宏(GE_module)以外的所有模块。
尝试杂项之后。解决方案,我的印象是,另一个头文件(hub.h)中不包含头文件(macros.h)。
如果问题是由场景背后的魔术工作室造成的,我不会感到惊讶。 因为hub.h和hub.c是从模板文件复制的,然后包含在项目中,但是其他大多数模块也是副本。
希望这里的人能够解决这个问题,因为前一段时间我没办法了,
我不再显示问题的详细描述,而是显示有关该问题的代码以及相关的注释。
很抱歉,无法为该问题找到更好的标签和标题,但对于问题所在,我一无所知。
编辑/更新:
我(某种程度上)想出了为什么这两个集线器功能在module.h中不可见。 hub.h包含在module.h和project.h中。如果project.h不包含集线器,则module.h可以查看功能。当然,缺点是project.c不再起作用。
花一些时间在杂项中上下移动#includes。文件,但找不到有效的包含顺序。
因此,为了能够继续进行项目的工作,我决定使用麻烦的宏i hub.h的副本,并让经验丰富的c程序员来解决该问题。
我很想听到对此的解释/解决方案,因为我很困惑。
stdafx.h
#include "dll/macros.h"
macros.h
#define GE_module_init(Istruct) BOOL module_ ## Istruct ## _init(Module* IImodule)
#define GE_module_delete(Istruct) BOOL module_ ## Istruct ## _delete(Module* IImodule)
#define GE_module(Istruct) \
GE_module_init(Istruct); \
GE_module_delete(Istruct);
hub.h
// Tried:
// Restarted Visual Studio
// Deleted build folders/files
// Deleted .sou
// Checking for tyops, again and again.
#include <dll/macros.h> // Don't help
#include "dll/macros.h" // Don't help
#include "../../../macros.h" // Don't help
// Copied from /macros.h. No warning about it's overridden
#define GE_module_init(Istruct) BOOL module_ ## Istruct ## _init(Module* IImodule)
// Copied from /macros.h. No warning about it's overridden
#define GE_module_delete(Istruct) BOOL module_ ## Istruct ## _delete(Module* IImodule)
// If renaming DD() to GE_module():
// init and delete functions is visible in module.c
// The functions is called according to trace.log
// No warning about it's overridden
#define DD(Istruct) \
GE_module_init(Istruct); \
GE_module_delete(Istruct);
// Hub is written in black, eg. not highlighted by Visual Studio as other modules is.
GE_module(Hub); // Compiler don't complain though
module.c
#include "dll/module/h/hub/hub.h"
#define FRIEND_DLL_module_init_delete_list(Istruct) \
f_delete_list [Istruct ## _Module_Type] = &module_ ## Istruct ## _delete;\
BOOL FRIEND_DLL_module_init()
{
// Error C2065 'module_Hub_delete': undeclared identifier
// And not C2065 as init()
FRIEND_DLL_module_init_delete_list(Hub);
}
#define module_create_init_sub_case(Istruct) \
case Istruct ## _Module_Type: \
return module_ ## Istruct ## _init(Imodule);
BOOL module_create_init_sub(Module* Imodule)
{
switch (Imodule->type)
{
// Warning C4013 'module_Hub_init' undefined; assuming
// And not C2065 as init()
module_create_init_sub_case(Hub)
}
}