2009-08-08 3 views
1

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

ответ

10

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

+0

Благодаря тонну мужчина, хотя я должен был подумать о том :) –

+0

Для того, чтобы добавить к этому, положите в него включают охрану в заголовочном файле cpu_t и # включить его везде, где вы используете эту структуру, таким образом вы не потеряете внутреннюю зависимость, если вы когда-либо удалите один из этих других файлов заголовков. –

0

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

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

+0

Я тоже согласен, кажется, что мне взломали –

0

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

+0

Нет сообщения об ошибке, только тот факт, что ни одно из определений не может быть доступно из включенных файлов. Это из-за включенных охранников, и gcc действительно не включает cpu.h. –

3

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

1

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

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

  • определить ЬурейиЙ для структуры центрального процессора:

    ЬурейеЙ структуры процессора тип_процессора;

  • определить переменную или элемент указателя типа на структуру процессора:

    структура процессора * PTR;

  • объявить внешнюю переменную тип структура CPU:

    экстерном структура CPY myCpu;

  • объявить функцию, принимая структуру центрального процессора аргумента:

    недействительного Foo (структура процессор р);

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

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

    struct intelcpu { struct cpu base; };

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

+0

Не нужно быть осторожным, если вам нужны register.h и addrmode.h в файле, где функции, которые используют внутренние элементы структуры. Если сначала включить cpu.h, тогда «struct cpu;» сглаживает предыдущее определение и нет членов в ныне неполной структуре; и если вы не включите cpu.h сначала (из всех заголовков, кроме, возможно, config.h), то вы не показали, что cpu.h может стоять сам по себе, что влияет на его удобство использования (и противоречит разумному стандарту кодирования C, обнародованному Центром космических полетов Годдарда НАСА). –

+0

Откуда у вас это получилось: struct cpu; будет сбивать предыдущее определение? Как вы определяете взаимно-рекурсивные типы, если декларация без определения невозможна. На самом деле, я был немного под влиянием моей практики на C++, строки, читающей struct cpu; один не нужен в C (в C++ он имеет тот же эффект, что и typedef struct cpu cpu, поскольку имена тегов автоматически набирают имена). Я закончу свой ответ. – AProgrammer

Смежные вопросы