Я работаю над обновлением 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)
}
}