#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;
}