Проблема с этим - круговое включение.Вы фактически включаете свою функцию, прежде чем объявить свою структуру.Допустим, вы включили config.h
(при условии, что вы удалили неправильный файл include a.h
, препроцессор делает это:
#include "debug.h"
typedef struct Config_t {
/* some stuff */
} Config;
и определяет символ CONFIG
, чтобы этот файл не был включен дважды. Затем оноценивает оставшиеся:
#include "config.h"
void somePrintingFunction(Config* conf);
typedef struct Config_t {
/* some stuff */
} Config;
и определяет символ DEBUG
. Поскольку символ CONFIG
определен, он не будет включать config.h
во второй раз и, таким образом, он завершен. Теперь обратите внимание, как объявлениефункции перед объявлением структуры. Чтобы решить эту проблему, используйте прямое объявление, подобное этому
#include "config.h"
struct Config_t;
void somePrintingFunction(struct Config_t* conf);
Таким образом, компилятор знает, что такое Config
, прежде чем использовать его. Просто имейте в виду, чтобы определить всефункции, которые используют предварительно объявленную структуру или класс в файле c
, поскольку предварительно объявленный объект еще не определен, но будет в файле c
.
РЕДАКТИРОВАТЬ: я должен упомянуть, что циклическое включение не являетсяэто хорошая вещь, и вы обычно можете найти другое решение, которое менее рискованно.