#include в.h или.c / .cpp?

При кодировании или в 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, или обоим нравится, я сделал здесь?

105
задан Louise 8 June 2010 в 23:33
поделиться

4 ответа

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

144
ответ дан 24 November 2019 в 03:59
поделиться

Поместите как можно больше include в ваш cpp и только те, которые нужны hpp файлу в hpp. Я считаю, что это поможет ускорить компиляцию, так как файлы hpp будут меньше ссылаться друг на друга.

Также рассмотрите возможность использования прямых деклараций в вашем hpp-файле для дальнейшего сокращения цепочки зависимостей include.

9
ответ дан 24 November 2019 в 03:59
поделиться

Если я #include , я не хочу, чтобы мне пришлось #include включать множество других заголовочных файлов, чтобы мой код скомпилировался. В callback.h вы должны включить все необходимое для компиляции. Но не более того.

Подумайте, не достаточно ли будет использовать прямые объявления в вашем заголовочном файле (например, class GtkButton;), что позволит вам уменьшить количество директив #include в заголовке (и, в свою очередь, время и сложность компиляции).

5
ответ дан 24 November 2019 в 03:59
поделиться

Единственный раз, когда вы должны включать заголовок в другой .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); это большая куча изжоги, которая только и ждет, чтобы случиться. Я серьезно. Я был в этом фильме несколько раз, и он всегда заканчивался тем, что Токио пылал.

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

Конечно, не стоит включать файлы, в которых нет необходимости.

47
ответ дан 24 November 2019 в 03:59
поделиться