C Не включать заголовочный файл / Не можете найти макрос? - PullRequest
0 голосов
/ 10 октября 2019

Я работаю над обновлением DLL, написанной на C, и несколько часов назад столкнулся с проблемой.

Среди прочего, проект использует макросы для генерации общих функций для модулей DLL (структуры, «унаследованные»). из модуля).

Эти макросы работают для всех модулей, кроме одного макроса (GE_module) для одного модуля (концентратора).

После того, как были выполнены попытки misc. Решения, у меня сложилось впечатление, что файл заголовка (macros.h) не включен в другой файл заголовка (hub.h).

Я не удивлюсь, если проблема вызвана какой-то магической визуальной-студия-за-сцены материал. Поскольку hub.h и hub.c копируются из файлов шаблонов, а затем включаются в проект, хотя большинство других модулей тоже являются копиями.

Надеюсь, что кто-то здесь сможет решить эту проблему, потому что я выбежалидей некоторое время назад,

Вместо более подробного описания проблемы, я показываю соответствующий код с комментариями о проблеме.

И извините за невозможность найти лучшие теги и заголовок дляэта проблема, но я довольно невежественна, в чем заключается проблема.


Редактировать / обновить:

Как я (вроде) выяснил, почему 2 функции хаба не являютсявидимый в module.h. hub.h включен в module.h и project.h. Если в project.h нет хаба, то module.h может видеть функции. Недостатком, конечно, является то, что project.c больше не работает.

Потратьте некоторое время на перемещение #include вверх и вниз по разному. файлов, но не может найти порядок включения, который работает.

Поэтому для продолжения работы над моей частью проекта я решил использовать копию проблемного макроса 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

модуль. с

#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)
    }
}
...