C不包含头文件/找不到宏吗?

时间:2019-10-09 23:56:32

标签: c macros header

我正在更新用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)
    }
}

0 个答案:

没有答案