2013-12-02 1 views
3

Я работаю над проектом, в котором я вынужден использовать ранее написанный код, который использует много файлов заголовков, вызывающих другие файлы заголовков. Я пытаюсь разделить мое приложение, но мне все еще нужно использовать многие типы и функции, определенные в предыдущем коде.C, используя декларацию о переходе в определении функции

Я добавил декларации в своих заголовочных файлах, ссылаясь на типы данных, объявленные в других файлах заголовков. Моя проблема сейчас, я пытаюсь ссылаться на тип объединения из определения функции в исходном файле, и я не совсем уверен, как это сделать.

Старый заголовочный файл:

/* filename: include.h */ 

typedef union SOME_UNION_TYPE 
{ 
    int a; 
    . 
    . 
}SOME_UNION_TYPE; 


Мой исходный файл:

/* filename: file.c */ 

void func() 
{ 
    SOME_UNION_TYPE A; 
    . 
    . 
    return; 
} 


Я знаю, что было бы проще просто включить "include.h" в моем исходном коде, но я Я стараюсь избегать его как можно больше. Моя попытка до сих пор заключалась в том, чтобы отправить объявление в мой заголовочный файл, в надежде разоблачить имя typedef компилятору.

Мой заголовочный файл:

/* filename: file.h */ 

union SOME_UNION_TYPE; 


Однако, когда я компилирую, я получаю сообщение об ошибке жалуется неизвестного размером для А в FUNC().

Заранее благодарим за любую помощь.

+5

Вы не можете выделить то, что было объявлено вперед. Однако вы можете создать указатель на все, что объявляется вперед. –

+0

@NoahWatkins спасибо! Я предположил, что в объявлении в заголовке указывается информация о размере во время компиляции. Мне нужно потратить некоторое время на лучшее понимание процесса компиляции и компоновки. – dsell002

ответ

3

Если вам нужно создать фактический экземпляр типа, вам потребуется полное объявление, а не только имя.

Правильная вещь в этом случае - укусить пулю и включить файл заголовка, который определяет тип.

+0

Чтобы добавить это: вы не можете ожидать, что компилятор выделит хранилище для переменной, не зная, как долго это должно быть!Вот почему вы можете перенаправлять объявления и определять _pointers_, поскольку все указатели имеют одинаковую длину; но вы не можете определить структуру указанного типа. – Guido

+0

@caf спасибо. Похоже, у меня есть возможность использовать указатель на тип, но делает ли это что-то мне, кроме ускорения компиляции? – dsell002

+0

@ dsell002: Нет, и есть только очень ограниченные вещи, которые вы можете сделать с указателем на неполный тип. – caf

1

Другой код, вероятно, включает в себя кучу других заголовков, потому что он им нужен! Вы должны просто включить другой заголовок, иначе вы дублируете код, который является плохим.

+0

Ваш правильный. Он определенно нуждается в других файлах, но во многих случаях есть файлы заголовков, которые ссылаются друг на друга. Я не лучший программист, но для меня это просто плохой дизайн. – dsell002

+1

Это может быть плохо написанная библиотека, которая тянет слишком много, но вы не можете это исправить. Уклонение от '# include' и дублирующего кода - это еще хуже! – John3136

+0

+1 к @ John3136. Уничтожение кода - это чума. Посмотрите, можете ли вы использовать временное кодирование для исправления существующих заголовков. – Guido

3

Директива #include не является чем-то, чего следует избегать. Если вас беспокоит код других людей, загрязняющий ваш код, вы можете создать заголовок, который включает нужные вам заголовки, и включить его напрямую.

Дублирующий код плохой.

+0

Спасибо за ответ! Можете ли вы объяснить, что вы подразумеваете под дублированием кода? Я не собирался переписывать код. Благодарю. – dsell002

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