2010-02-10 4 views
2

은 가정하자 그래서헤더 파일에 어떤 파일을 포함시켜야합니까? 구조체? <stdbool.h>?

struct box { 
    int value; 
} 

처럼 "struct.h"에서 구조체를 정의하고 나는 다른 파일에 구조체는 "math.c"

#include "struct.h" 

struct box *sum(struct box *a1, struct box *a2) { 
    struct box *a3 = malloc(sizeof (struct box)); 
    a3->value = a1->value + a2->value; 
    return a3; 
} 

"math.h"할 필요성을 말하는 것을 사용 "struct.h"도 포함시켜야합니까?

#include "struct.h" 

struct box *sum(struct box *a1, struct box *a2); 

struct box가 bool로 바뀌면 stdbool.h를 헤더와 c 파일에 모두 포함해야합니까? 컴파일러가 이것을 원한 것처럼 보입니다.

.c 파일보다는 헤더에 언제 파일을 포함해야합니까? 내 예제와 함께 뭔가 이상한 지 궁금해.

감사합니다.

답변

3

일반적으로 헤더 파일에는 가능한 한 적은 것을 포함시키는 것이 일반적입니다.

가능한 경우 정의 대신 정방향 선언을 사용하면 정의를 .c 파일로 이동할 수 있습니다. 이렇게하면 헤더 파일에 포함해야하는 파일 수를 줄일 수 있습니다.

특정 예에서 struct.h의 포함을 math.h에서 제거하고 대신 선언 상자를 제거 할 수 있습니다. 이 특별한 경우에는 큰 차이가 없습니다.

+0

bool에 대한 선언을 어떻게 진행하나요? – overcyn

+0

@overcyn : 할 수 없습니다 : 형식이 아닌 매크로입니다. 선언 매크로는 전달할 수 없습니다. –

+0

C99에는 '_Bool'이라는 기본 제공 유형이 있습니다. 'stdbool.h'는'typedef'를'bool'으로,'#define'을'true'와'false'로 만듭니다. – asveikau

2

헤더 파일의 내용이 이러한 포함에 정의 된 유형을 사용하는 경우 헤더 파일에 다른 포함을 포함시킵니다. (죄송합니다, 그건 입습니다.) 이미 시스템이 제공하는 math.h이 있기 때문에 사용자 정의 헤더 파일 (이전에 좋은 이름이없는 둘 것을 주장하지만

귀하의 경우에는

math.h 확실히, struct.h 포함해야한다 ; 후자는 struct가 키워드이기 때문에). :-P

헤더 파일에 bool을 사용하는 경우 stdbool.h을 포함해야합니다.

3

"math.h"는 "struct.h"도 포함해야합니까?

아니요. math.h (위대한 이름은 아니며 BTW)에서 유형에 대한 포인터 만 처리하기 때문입니다. 정의는 유형의 인스턴스를 다루는 경우에만 필요합니다. 그러나 인 실제 인스턴스로 트래픽하는 사용자는 별도로 포함시켜야하므로 사용자에게 포함하는 것이 좋습니다.

+0

최종 문장으로 인해 딱딱 해졌습니다. 목에있는 상흔 통증은 일부 기능이 필요로하는 모든 헤더를 추적해야하는데, 사용해야 할 헤더는 선언해야하는 헤더 일뿐입니다. –

관련 문제