Как связать несколько файлов реализации в C

У меня есть ряд .c файлы, т.е. файлы реализации говорят

  • main.c
  • переменный ток
  • До нашей эры

Где функции из любого файла могут вызывать любую функцию из разных файлов. Мой вопрос в том, нужно ли мне .h то есть файл заголовка для каждой реализации A и B, где каждый файл заголовка имеет определение ВСЕХ функций в A или B.

Кроме того, main.c будет иметь оба A.h а также B.h #included в этом?

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

Благодарю.

3 ответа

Решение

Содержимое заголовка

Заголовок A.h за A.c должен содержать только ту информацию, которая необходима для внешнего кода, использующего средства, определенные в A.c, Он не должен объявлять статические функции; он не должен объявлять статические переменные; он не должен объявлять внутренние типы (типы, используемые только в A.c). Следует убедиться, что файл может использовать только #include "A.h" а затем в полной мере использовать средства, опубликованные A.c, Он должен быть автономным и идемпотентным (чтобы вы могли включить его дважды без ошибок компиляции). Вы можете просто проверить, что заголовок автономен, написав #include "A.h" как первый #include линия в A.c; Вы можете проверить, что он идемпотентен, включив его дважды (но это лучше сделать отдельным тестом). Если он не компилируется, он не самодостаточен. Аналогично для B.h а также B.c,

Для получения дополнительной информации о заголовках и стандартах см. " Должен ли я использовать #include в заголовках? ', который ссылается на стандарт кодирования NASA, и' Связывание со статической библиотекой ', который включает скрипт chkhdr что я использую для проверки самодостаточности и идемпотентности.

соединение

Обратите внимание, что main.o зависит от main.c, A.h а также B.h, но main.c Сам не зависит от заголовков.

Когда дело доходит до компиляции, вы можете использовать:

gcc -o program main.c A.c B.c

Если вам нужны другие опции, добавьте их (большинство флагов в начале; библиотеки в конце, после исходного кода). Вы также можете скомпилировать каждый файл в объектный код отдельно, а затем связать объектные файлы вместе:

gcc -c main.c
gcc -c A.c
gcc -c B.c
gcc -o program main.o A.o B.o

Это будет зависеть от компилятора, но если вы используете gcc, вы можете использовать что-то вроде этого:

gcc -Wall main.c A.c B.c -o myoutput

Посмотрите http://www.network-theory.co.uk/docs/gccintro/gccintro_11.html (первый ответ Google) для получения дополнительной информации. Вы можете скомпилировать его в несколько объектных файлов / библиотек:

gcc -c main.c
gcc -c A.c
gcc -c B.c
gcc -o mybin main.o A.o B.o

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

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

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

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

Вы хотите использовать

gcc -g *.c -lm

Это экономит ввод текста и позволит вам связать все ваши файлы c в вашем проекте.

Другие вопросы по тегам