Сложно включить ситуацию в C - PullRequest
1 голос
/ 08 августа 2009

У меня есть файл с именем cpu.h, который включает в себя два других заголовка с именами register.h и addrmode.h. Структура cpu_t определена в cpu.h, который включает в себя необходимость своих функций. Я пытаюсь включить cpu.h в два других включаемых файла, но ничего не включено. Я предполагаю, что они не включены из-за включенных охранников, установленных в cpu.h. Кто-нибудь знает, как это можно решить?

Ответы [ 5 ]

10 голосов
/ 08 августа 2009

Объявите cpu_t в своем собственном заголовочном файле, который включают остальные три, возможно types.h?

3 голосов
/ 08 августа 2009

Циркулярные включения могут стать помехой для обслуживания и отладки кода. Я бы предложил разделить cpu.h на два файла: один, который включает register.h и addrmode.h, и один, который включает эти два файла.

1 голос
/ 08 августа 2009

Либо расположите register.h и addrmode.h так, чтобы им не требовалось определение структуры, либо переместите объявление структуры в собственный заголовок.

Обратите внимание, что вам не нужно определение процессора:

  • для определения typedef для struct cpu:

    typedef struct cpu cpu_type;

  • для определения переменной или члена указателя типа на struct cpu:

    struct cpu * ptr;

  • для объявления внешней переменной типа struct cpu:

    extern struct cpy myCpu;

  • для объявления функции с аргументом struct cpu:

    void foo (struct cpu p);

Таким образом, основные причины, по которым необходимо определить структуру в заголовке, целью которого не является предоставление этого определения:

  • вы определяете в заголовке структуру, имеющую член типа struct cpu:

    struct intelcpu { структура базы процессора; };

  • вы определяете встроенные функции, необходимые для доступа к членам или имеющие локальную переменную этого типа

0 голосов
/ 08 августа 2009

Вы заявили, что «ничего не включено», но это вывод, основанный на каком-то другом наблюдении. Какое сообщение об ошибке вы видите? Я думаю, что нам нужно больше информации.

0 голосов
/ 08 августа 2009

Вы можете определить struct cpu_t в cpu.h до того, как она включает в себя два других заголовка?

На самом деле, мне больше нравится ответ Орен Трутнер.Мой ответ гораздо более хрупкий - вам действительно не нужны взаимно рекурсивные заголовочные файлы.

...