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

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

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

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

Кроме того, main.c будет включать в себя как Ah и Bh #included ?

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

Благодарю.

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

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

    Дополнительные сведения о заголовках и стандартах см. В разделе « Должен ли я использовать #include в заголовках? ‘, который ссылается на стандарт кодирования НАСА и « Связывание с статической библиотекой », который включает в себя скрипт chkhdr который я использую для тестирования самоограничения и идемпотентности.

    соединение

    Обратите внимание, что main.o зависит от main.c , Ah и Bh , но main.c сам по себе не зависит от заголовков.

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

     gcc -o program main.c Ac Bc 

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

     gcc -c main.c gcc -c Ac gcc -c Bc gcc -o program main.o Ao Bo 

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

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

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

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

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

     gcc -Wall main.c Ac Bc -o myoutput 

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

     gcc -c main.c gcc -c Ac gcc -c Bc gcc -o mybin main.o Ao Bo 
    Давайте будем гением компьютера.