2016-01-12 1 views
-2

У меня есть простая программа в двух единицах:Зачем нужны заголовки?

count_words.c:

int main(int argc, char ** argv) 
{ 
    printf("starting\n"); 
    int i = aaa(55555); 
    printf("%d",i); 
    printf("ending\n"); 
    return i; 
} 

clean.c:

int aaa(int i) 
{ 
    printf("aaa\n"); 
    return 5; 
} 

Makefile:

count_words: clean.o count_words.o -lfl 
     gcc count_words.o clean.o -lfl -ocount_words 

%.o:%.c 
     gcc -c -o [email protected] $< 

Программа строит отлично и работает , но в count_words.c Я не включал заголовочный файл с функцией int aaa(int) Объявление от clean.c. Почему мне нужен файл заголовка вообще, так как у меня нет проблем с компиляцией программы без них?

+2

Возможный дубликат [Заголовок для исходного файла] (http://stackoverflow.com/questions/1167875/header-per-source-file) – dandan78

+1

Да, в простом надуманном примере вам не нужен * заголовок файл. – TZHX

+0

Когда невозможно обойтись без заголовков? – vico

ответ

1

Файлы заголовка обычно содержат объявления функций, которые служат в качестве прямого объявления. Без функции декларации функции любой вызов функции считается неявным объявлением функции.

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

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

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

+0

Мне очень хотелось бы иметь указатель на «не полезную» часть. Благодарю. –

+0

Итак, причина иметь заголовочный файл - это возможность не использовать неявное объявление. И неявное объявление не поддерживается новым стандартом. Но почему он больше не поддерживается? – vico

+1

@vico неявное объявление плохое, так как очень легко иметь несоответствие между типом возвращаемого значения и/или дополнительным списком. Когда вы отправляете объявление функции, компилятор знает прототип и может проверять любые человеческие ошибки. Это облегчает жизнь. –

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

  • Нет связанных вопросов^_^