Podczas kodowania w C lub C ++, gdzie powinienem mieć #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));
...
Czy wszystkie elementy powinny znajdować się w pliku .h lub .c / .cpp, czy w obu, tak jak to zrobiłem tutaj?
Odpowiedzi:
Umieść jak najwięcej w,
.c
a jak najmniej, w.h
. Włączenia w elemencie.c
są uwzględniane tylko wtedy, gdy kompilowany jest ten jeden plik, ale.h
dołączenia dla elementu muszą być uwzględnione w każdym pliku, który go używa.źródło
#ifndef _CALLBACK_H_
na górze element nie uniemożliwia kompilatorowi przetwarzania go więcej niż jeden raz?.h
jest unikanie w niektórych przypadkach błędu z powodu pętli włączania. Przykład: dwie klasy potrzebują się wzajemnie do implementacji, ale nie do swoich deklaracji. Umieszczenie obu włączeń w.cpp
s pozwoli uniknąć błędu.Jedyny przypadek, w którym powinieneś dołączyć nagłówek do innego pliku .h, to sytuacja, gdy potrzebujesz dostępu do definicji typu w tym nagłówku; na przykład:
Jeśli nagłówek A zależy od nagłówka B, tak jak w powyższym przykładzie, nagłówek A powinien zawierać bezpośrednio nagłówek B. Czy nie spróbować zamówić zawiera w pliku .c aby spełnić zależności (czyli w tym nagłówka B przed nagłówka a); to jest wielki stos zgagi, który czeka. Mam to na myśli. Byłem w tym filmie kilka razy i zawsze kończył się płomieniami Tokio.
Tak, może to spowodować wielokrotne dołączanie plików, ale jeśli mają one odpowiednie zabezpieczenia włączające skonfigurowane w celu ochrony przed wieloma błędami deklaracji / definicji, to kilka dodatkowych sekund czasu kompilacji nie jest warte martwienia się. Próba ręcznego zarządzania zależnościami to ból w dupie.
Oczywiście nie powinieneś dołączać plików, których nie potrzebujesz .
źródło
Umieść jak najwięcej dołączeń w swoim cpp i tylko te, które są wymagane przez plik hpp w hpp. Wierzę, że pomoże to przyspieszyć kompilację, ponieważ pliki hpp będą mniej odsyłacze.
Rozważ również użycie deklaracji przekazywania w pliku hpp, aby jeszcze bardziej zmniejszyć łańcuch zależności dołączania.
źródło
Jeśli tak
#include <callback.h>
, nie chcę mieć#include
wielu innych plików nagłówkowych, aby skompilować mój kod. Wcallback.h
powinieneś zawrzeć wszystko, co potrzebne do kompilacji. Ale nic więcej.Zastanów się, czy użycie deklaracji forward w pliku nagłówkowym (takich jak
class GtkButton;
) będzie wystarczające, co pozwoli ci zmniejszyć liczbę#include
dyrektyw w nagłówku (a co za tym idzie, mój czas kompilacji i złożoność).źródło