Когда я кодирую на C или C ++, где мне взять #include
's?
callback.h:
#ifndef _CALLBACK_H_
#define _CALLBACK_H_
#include <sndfile.h>
#include "main.h"
void on_button_apply_clicked(GtkButton* button, struct user_data_s* data);
void on_button_cancel_clicked(GtkButton* button, struct user_data_s* data);
#endif
callback.c:
#include <stdlib.h>
#include <math.h>
#include "config.h"
#include "callback.h"
#include "play.h"
void on_button_apply_clicked(GtkButton* button, struct user_data_s* data) {
gint page;
page = gtk_notebook_get_current_page(GTK_NOTEBOOK(data->notebook));
...
Должны ли все включения быть в .h или .c / .cpp, или в обоих, как я сделал здесь?
Ответы:
Поместите как можно больше в
.c
и как можно меньше в.h
. Включаемые.c
элементы включаются только в том случае, если этот один файл скомпилирован, но включения.h
должны быть включены в каждый файл, который его использует.источник
#ifndef _CALLBACK_H_
мешает компилятору обрабатывать его более одного раза?.h
объект, - это избежать в некоторых случаях ошибки из-за цикла включения. Пример: два класса нуждаются друг в друге для их реализации, но не для их объявлений. Включение обоих включений в.cpp
s позволит избежать ошибки.Единственный раз, когда вы должны включать заголовок в другой файл .h, - это если вам нужно получить доступ к определению типа в этом заголовке; например:
Если заголовок A зависит от заголовка B, как в примере выше, тогда заголовок A должен включать заголовок B напрямую. Как НЕ пытаться заказать ваш включает в .c файле для удовлетворения зависимостей (то есть, в том числе заголовка B до заголовка A); это большая куча изжоги, ожидающей своего часа. Я серьезно. Я был в этом фильме несколько раз, и он всегда заканчивался огнем Токио.
Да, это может привести к тому, что файлы будут включены несколько раз, но если у них есть надлежащие средства включения, настроенные для защиты от множественных ошибок объявления / определения, то несколько дополнительных секунд времени сборки не стоит беспокоиться. Попытка управлять зависимостями вручную - заноза в заднице.
Конечно, не следует включать файлы, в которых нет необходимости .
источник
Поместите как можно больше включений в ваш cpp, и только те, которые необходимы для файла hpp в файле hpp. Я считаю, что это поможет ускорить компиляцию, так как файлы hpp будут иметь меньше перекрестных ссылок.
Также рассмотрите возможность использования форвардных объявлений в вашем файле hpp для дальнейшего сокращения цепочки зависимостей включения.
источник
Если да
#include <callback.h>
, я не хочу, чтобы у меня было#include
много других файлов заголовков для компиляции моего кода. Вcallback.h
него следует включить все необходимое для компиляции. Но не более того.Подумайте, будет ли достаточно использования форвардных объявлений в вашем файле заголовка (например,
class GtkButton;
), что позволит вам уменьшить количество#include
директив в заголовке (и, в свою очередь, время и сложность компиляции).источник