Разница между включением в .h файл и .c файл - PullRequest
1 голос
/ 30 марта 2012

В чем разница между #include в файле .h и в файле .c?

Например, у меня есть файлы a.h и a.c, которые имеютclass A.Я использую class A в class B (b.h, b.c).В чем разница между включением:

#include "a.h"

в b.h против b.c?

Ответы [ 6 ]

5 голосов
/ 30 марта 2012

Обычно определение класса обычно находится в вашем файле .h, а реализация - в вашем файле .c (pp).

Одно из преимуществ использования #include "a.h" в вашем bc-файле, а не в bh-файле, заключается в том, что при изменении ах не только bc, но и любой другой файл, содержащий bh, будет перекомпилироваться.

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

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

Так что, если возможно, лучше всего #include "a.h" в до н.э.

Но это не всегда возможно.Если вы просто используете A внутри bc, а в bh нет ссылок на A, тогда все в порядке.Кроме того, если bh содержит только указатели на A (т. Е. Как члены, аргументы функций или возвращаемые значения), но не ссылается на «типозависимые» ссылки, вы также можете поместить в bh только это:1018 * в вашем bc. Но если есть еще ссылки или зависимости от ах, без которых никто, включая bh, действительно не может обойтись, тогда #include "a.h" должен перейти в bh

2 голосов
/ 30 марта 2012

Если вы поместите директиву include в файл заголовка, другие файлы, которые включают этот файл заголовка, также получат включенный заголовок.

foo.h:

#include "dependency.h"

bar.h:

#include "foo.h"

В этом случае bar.h имеет как foo.h, так и dependency.h.

2 голосов
/ 30 марта 2012

Нет разницы во включении файла заголовка в файл .h или .c.
Содержимое включенного файла просто копируется и вставляется в файл, в который вы его включаете.

0 голосов
/ 30 марта 2012

Вы можете включить .c файлы - но по соглашению вы не делаете.

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

0 голосов
/ 30 марта 2012

.h файлы помещаются поверх файлов .c или .h перед компиляцией

, но файлы .c компилируются отдельно, затем ссылка на геттер для создания исполняемого файла

0 голосов
/ 30 марта 2012

#include "a.h" расширяется до содержания a.h.

Если #include "a.h" помещено в b.h, тогда a.h будет скопировано в b.h во время компиляции.

Если #include "a.h" помещен в b.c, тогда a.h будет скопирован в b.c во время компиляции.

...