При кодировании или в C или в C++, где я должен иметь #include
?
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
должны быть включены в каждый файл, который его использует.
Поместите как можно больше include в ваш cpp и только те, которые нужны hpp файлу в hpp. Я считаю, что это поможет ускорить компиляцию, так как файлы hpp будут меньше ссылаться друг на друга.
Также рассмотрите возможность использования прямых деклараций в вашем hpp-файле для дальнейшего сокращения цепочки зависимостей include.
Если я #include
, я не хочу, чтобы мне пришлось #include
включать множество других заголовочных файлов, чтобы мой код скомпилировался. В callback.h
вы должны включить все необходимое для компиляции. Но не более того.
Подумайте, не достаточно ли будет использовать прямые объявления в вашем заголовочном файле (например, class GtkButton;
), что позволит вам уменьшить количество директив #include
в заголовке (и, в свою очередь, время и сложность компиляции).
Единственный раз, когда вы должны включать заголовок в другой .h файл, это если вам нужно получить доступ к определению типа в этом заголовке; например:
#ifndef MY_HEADER_H
#define MY_HEADER_H
#include <stdio.h>
void doStuffWith(FILE *f); // need the definition of FILE from stdio.h
#endif
Если заголовок A зависит от заголовка B, как в примере выше, то заголовок A должен включать заголовок B напрямую. Не НЕ пытайтесь упорядочить свои включения в .c-файле, чтобы удовлетворить зависимости (то есть, включить заголовок B перед заголовком A); это большая куча изжоги, которая только и ждет, чтобы случиться. Я серьезно. Я был в этом фильме несколько раз, и он всегда заканчивался тем, что Токио пылал.
Да, это может привести к тому, что файлы будут включаться несколько раз, но если у них установлены надлежащие защитные механизмы включения для защиты от многочисленных ошибок объявления/определения, то несколько лишних секунд времени сборки не стоят того, чтобы беспокоиться об этом. Пытаться управлять зависимостями вручную - та еще морока.
Конечно, не стоит включать файлы, в которых нет необходимости.