2009-07-29 4 views
21

Я пытаюсь научить себя программированию C, и я использую DevC++ для своей среды разработки под Windows XP. Я немного запутался в правильном способе вызвать свои собственные файлы заголовков.C Заголовочный файл - правильный способ включить

У меня есть основной исходный файл называется main.c и отдельный файл для функций называется myFunctions.c, который я включаю в main.c, используя «включаю„myFunctions.h“ с всеми моими прототипами функций, проживающими в этом заголовке файл.

myFunctions.c содержит две функции, называемые showDate(), и одну, называемую showScreen(), и обе функции могут быть вызваны из main.c все хорошо и хорошо.

Мои проблемы начались, когда я попытался вызвать showDate() из showScreen(), и во время компиляции/ссылки он жаловался, потому что у меня не было прототипа внутри myFunctions.c для showDate().

Что я хочу знать, какое из следующих действий мне нужно сделать?

  1. включают "myFunctions.h" внутри myFunctions.c

  2. Объявите прототип в обоих myFunctions.h и myFunctions.c
  3. Объявите прототип всего myFunctions.c только

Все вышеперечисленное, похоже, исправляет ошибку компилятора и позволяет мне вызвать функцию bot из main.c и внутри myFunctions.c, но я не могу найти окончательный источник, который является правильной процедурой.

ответ

24

Используйте # 1 - #include во многих местах.

Никогда не используйте # 2 - никогда не объявляйте ничего более одного раза.

Редко использовать # 3 - объявить что-то в файле .c, как будто вы никогда не собираетесь его повторно использовать.

+6

Возможно, рассмотрите видимость, прежде чем принимать решение между # 1 и # 3. Используйте # 1, если вам нужно вызвать эту функцию из какого-либо другого .c-файла. Используйте # 3, если функция не нужна нигде вне локального файла. Таким образом, вы уменьшаете беспорядок в ваших заголовочных файлах и действительно можете использовать их в качестве определения интерфейса. –

+4

Справа. Функции, вызываемые из других источников, должны быть в файле .h. Внутренние функции должны быть объявлены статическими и прототипированными в .c файле. Это дает C некоторую столь необходимую модульность. –

2

Вы должны выбрать вариант 1. Или заказать myfunctions.c, чтобы определение вызываемой функции выполнялось перед вызывающей ее функцией. Включив заголовок в файле, вы позволяете компилятору поймать любое несоответствие между объявлением и определением.

7

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

BTW DecC++ больше не активно развивается - вместо этого вы должны перейти на Code::Blocks.

+0

Спасибо Нейл, я рассмотрю код :: Блоки немного позже –

+1

Код :: Блок фантастический - первое, что я заметил, это Code Folding, который был чем-то, что я действительно хотел в DevC++ Cheers Neil! –

3

Определенно первый вариант.

1

Как и все остальные, вы должны использовать первый вариант. Общее правило состоит в том, что прототипы функций находятся в файлах .h и их реализациях в .c-файлах.

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