Включить заголовки в c

#c #header #include

#c #заголовок #включать

Вопрос:

У меня есть что-то вроде этого:

 //main.cpp
#include <add.h>

cin >> a;
cin >> b;
cout << add(a,b);


//add.h
#ifndef add_h
#define add_h

int add(int a, int b);

#endif 


//add.cpp
int add(int a, int b){
    return a b;
}
  

Должен ли я включать add.h в add.cpp тоже или я могу включить это только в main.cpp ?
Я спрашиваю, потому что я это где-то видел, и мне любопытно, какой способ лучше.

Комментарии:

1. Я думаю, что любой базовый учебник по C объясняет это.

2. Ваш main.cpp очевидно, не будет работать без вложения инструкций в тело функции int main() {}`.

Ответ №1:

Вы можете включить это, но здесь это не обязательно.

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

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

Комментарии:

1. Хороший ответ — но нет необходимости в «Я надеюсь, вы это понимаете». в конце ответа. Обычно становится очевидным, есть это или нет, и это не добавляет никакой ценности.

Ответ №2:

Должен ли я включать add.h в add.cpp тоже или я могу включить это только в main.cpp ?

В этом случае вам не нужно нет.

 int add(int a, int b);
  

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

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

Main.cpp:

 extern int add(int a, int b);

cin >> a;
cin >> b;
cout << add(a,b);
  

Add.cpp:

 int add(int a, int b){
    return a b;
}