.h 또는 .c / .cpp에 #include? 있어야 합니까? callback.h : #ifndef _CALLBACK_H_ #define _CALLBACK_H_ #include

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));

  ...

모든 include는 .h 또는 .c / .cpp에 있어야합니까, 아니면 내가 여기서 한 것처럼 둘 다에 있어야합니까?



답변

.c가능한 한 많이 넣고 .h. 의 포함 .c은 해당 파일이 컴파일 될 때만 포함되지만의 포함은 해당 .h파일을 사용하는 모든 파일에 포함되어야합니다.


답변

다른 .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 파일에 포함을 주문 하지 마십시오 (즉, 헤더 A 앞에 헤더 B 포함). 그것은 일어나기를 기다리는 속쓰림의 큰 더미입니다. 진심이야. 나는 그 영화에 여러 번 출연했으며 항상 도쿄에서 불길로 끝났습니다.

예, 이로 인해 파일이 여러 번 포함될 수 있지만 여러 선언 / 정의 오류로부터 보호하기 위해 적절한 include 가드가 설정되어 있다면 몇 초의 빌드 시간은 걱정할 가치가 없습니다. 종속성을 수동으로 관리하려는 것은 당연한 일입니다.

물론 필요 하지 않은 파일을 포함해서는 안됩니다 .


답변

cpp에 가능한 한 많이 포함하고 hpp의 hpp 파일에 필요한 것만 넣으십시오. 나는 이것이 hpp 파일이 덜 상호 참조되기 때문에 컴파일 속도를 높이는 데 도움이 될 것이라고 믿습니다.

또한 포함 종속성 체인을 줄이기 위해 hpp 파일에서 정방향 선언 을 사용하는 것을 고려 하십시오.


답변

만약 내가 #include <callback.h>, 나는 #include내 코드를 컴파일하기 위해 많은 다른 헤더 파일 이 필요하지 않습니다 . 에서 callback.h당신이에 대해 컴파일하는 데 필요한 모든 것을 포함해야한다. 하지만 더 이상은 없습니다.

헤더 파일 (예 :)에서 정방향 선언을 사용 class GtkButton;하는 것이 #include충분한 지 고려하여 헤더 의 지시문 수 (그리고 컴파일 시간 및 복잡성) 를 줄일 수 있습니다 .


답변