Ao codificar em C ou C ++, onde devo ter o #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));
...
Todas as inclusões devem estar em .h ou .c / .cpp, ou em ambos, como fiz aqui?
Respostas:
Coloque o máximo que puder no
.c
e o mínimo possível no.h
. As inclusões no.c
são incluídas apenas quando aquele arquivo é compilado, mas as inclusões no.h
devem ser incluídas por cada arquivo que o utiliza.fonte
#ifndef _CALLBACK_H_
impede o compilador de processá-lo mais de uma vez?.h
é para evitar em alguns casos um erro por causa de um laço de inclusão. Exemplo: duas classes precisam uma da outra para suas implementações, mas não para suas declarações. Colocar ambos os includes no.cpp
s evitará um erro.A única vez em que você deve incluir um cabeçalho em outro arquivo .h é se precisar acessar uma definição de tipo nesse cabeçalho; por exemplo:
Se o cabeçalho A depender do cabeçalho B, como no exemplo acima, o cabeçalho A deverá incluir o cabeçalho B diretamente. fazer nÃO tentar encomendar o seu inclui no arquivo .c para satisfazer dependências (isto é, incluindo cabeçalho B antes de cabeçalho A); essa é uma grande pilha de azia esperando para acontecer. Quero dizer. Já estive nesse filme várias vezes, e sempre terminava com Tóquio em chamas.
Sim, isso pode resultar em arquivos sendo incluídos várias vezes, mas se eles tiverem guardas de inclusão apropriados configurados para proteger contra vários erros de declaração / definição, então alguns segundos extras de tempo de compilação não valem a pena se preocupar. Tentar gerenciar dependências manualmente é um pé no saco.
Obviamente, você não deve incluir arquivos desnecessários .
fonte
Coloque o máximo possível de inclusões em seu cpp e apenas aquelas que são necessárias para o arquivo hpp no hpp. Acredito que isso ajudará a acelerar a compilação, pois os arquivos hpp terão menos referências cruzadas.
Considere também o uso de declarações de encaminhamento em seu arquivo hpp para reduzir ainda mais a cadeia de dependência de inclusão.
fonte
Se eu
#include <callback.h>
, não quero ter#include
muitos outros arquivos de cabeçalho para fazer meu código compilar. Emcallback.h
você deve incluir tudo o necessário para compilar contra ele. Mas nada mais.Considere se usar declarações de encaminhamento em seu arquivo de cabeçalho (como
class GtkButton;
) será suficiente, permitindo que você reduza o número de#include
diretivas no cabeçalho (e, por sua vez, meu tempo de compilação e complexidade).fonte