.h 또는 .c / .cpp에 #include?


118

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에 있어야합니까, 아니면 내가 여기서 한 것처럼 둘 다에 있어야합니까?


2
나에게이 약을 켜고 물어 보자 : 무엇을했다 당신의 callback.h에 sndfile.h 및 main.h을 넣어 결정하는 기준은?
Owen S.

답변:


161

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


6
사실이지만 #ifndef _CALLBACK_H_그 위에있는은 컴파일러가 두 번 이상 처리하는 것을 방해하지 않습니까?
hytromo 2014

11
@ user9379 .c 또는 .cpp 파일 당 두 번 이상 포함되는 것을 방지합니다. 각 .c 또는 .cpp 파일은 일반적으로 개별적으로 빌드되므로 컴파일하는 각 .c 또는 .cpp 파일에 대해 .h가 다시 구문 분석됩니다.
Brendan Long

2
가능한 한 적게 넣는 주된 이유 .h는 포함 루프로 인한 오류를 피하는 것입니다. 예 : 두 클래스는 구현을 위해 서로가 필요하지만 선언에는 필요하지 않습니다. 두 include를 모두 .cpps 에 넣으면 오류가 발생하지 않습니다.
Codoscope

1
@ Qu'est-cet'yont 그것이 .h 파일에 특정 항목을 넣을 수없는 이유 입니다. 이 대답은 그보다 더 적게 넣어야하는 이유에 대한 것입니다.
Brendan Long

@BrendanLong 내 의미에서 여러 번 포함하는 동일한 헤더는 내용을 한 번만 포함하도록 올바른 매크로를 내부에 넣으면 중요하지 않습니다. 따라서 더 적게 넣는 것은 코드를 수정하여 향후 오류가 발생할 가능성을 줄이는 것이라고 생각합니다.
Codoscope

55

다른 .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 가드가 설정되어 있다면 몇 초의 빌드 시간은 걱정할 가치가 없습니다. 종속성을 수동으로 관리하려는 것은 당연한 일입니다.

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


10

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

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


1
우. 앞으로 선언하는 것은 흥미 롭습니다.
Brendan Long

Parappa, 순방향 선언은 순환 참조 시나리오에서 매우 유용합니다. 하지만 다른 시나리오에서도 좋은 방법이 될까요? (저는 C ++를 처음 사용하므로 솔직히 묻습니다.)
Dzyann

5

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

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


동의하지 않습니다. H 파일에 전 세계를 포함하면 종속성 체인이 증가하므로 컴파일 시간이 늘어납니다.
John Dibling

헤더 파일의 전체 세계를 포함하여 권장하지 않았다 내 대답은, I는 다음과 같은 제안 단지 충분히 API의 사용자 종속성 검색 시간을 할애 할 필요가 없습니다 그래서.
Johnsyweb 2010 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.