Метод в заголовочных файлах - PullRequest
2 голосов
/ 16 сентября 2010

Почему некоторые люди пишут методы в заголовочном файле?

А в чем разница между написанием метода в файле процедуры и в файле заголовка?

Вот код:

Work.h

#include <time.h>

void DoWork(int n)
{
    clock_t t = clock() + n * CLOCKS_PER_SEC / 1000;
    while(clock() < t);
}

program.c

#include <stdio.h>
#include "work.h"
int main(void)
{
     printf("Starting work\n");
     DoWork(100);
     printf("Work has finished\n");
}

Есть ли разница между записью метода в файле процедуры и заголовочном файле или они одинаковы?

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

Спасибо.

Ответы [ 2 ]

3 голосов
/ 16 сентября 2010

Препроцессор, среди прочего, рекурсивно заменит все директивы #include на код этих заголовков. (По сути, это тупая машина для замены текста.) Результат, исходный файл со всеми включенными в него рекурсивно скопированными заголовками, называется единицей перевода . По сути, это то, что видит ваш компилятор (хотя современные компиляторы часто объединяют разные этапы процесса перевода, чтобы быть быстрее).
Вы можете иметь несколько единиц перевода, участвующих в одной результирующей программе. (На самом деле, с чем-то, превышающим 50 строк кода, это в значительной степени стандарт.)

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

1 голос
/ 16 сентября 2010

Все сводится к «управлению проектами».

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

В небольшом проекте (как, например, ваш «рабочий» проект выше) легко увидеть, что нет дублирования кода, но со временем ваш проект становится все труднее управлять.Если несколько ваших файлов '.c' #include "work.h", каждый из них получит копию определения функции DoWork.Если вы поместите определение функции в файл «.c» или его собственное объявление, а объявление в файл «.h», то ошибок не будет.

объявление функции : сообщитекомпилятор, как использовать функцию
определение функции : сообщить компилятору, что делает функция

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...