2008-11-07 3 views
1

C에서 포함 순환을 어떻게 방지합니까? 즉. #include "b.h"는 #include "c.h"에 #include "a.h"를 포함해서는 안됩니다. 나는 어떤 종류의 C 지시어를 사용하여 이런 일이 일어나지 않도록하는 방법을 찾고있다. 아C 헤더 파일의 포함 사이클

내용 : BH의

#ifndef __A_H 
#define __A_H 

#include "b.h" 

#endif // __A_H 

내용 : 채널의

#ifndef __B_H 
#define __B_H 

#include "c.h" 

#endif // __B_H 

내용 :

나는 원래 이런 일이 발생을 방지 한 것이라고 생각했다
#ifndef __C_H 
#define __C_H 

#include "a.h" 

#endif // __C_H 

하지만 작동하지 않는 것 같습니다.

+0

문제이며 포함 순환과는 아무런 관련이 없습니다. 내 문제를 일으키는 헤더 파일에 열거 형을 포함 시켰습니다. 감사! – MSumulong

+0

열거 형은 헤더의 서비스 소비자가 필요할 경우 헤더에 배치 할 수 있습니다. –

답변

7

그것은 무사 작동합니까 : 파일 반복적으로 포함하지만 #의 ifdndef/#에 의해 보호 섹션/# ENDIF 정의는 반복되지 있으며, 그주기를 나누기.

컴파일러를 사용하여 사전 처리 된 출력물을 생성하고 직접보십시오. 주요 밑줄

gcc -E $(CFLAGS) -o foo.i foo.cpp 
+0

나는 네가 옳다고 믿는다. 내 문제는 헤더 파일에 정의 된 열거 형과 관련이 있다고 생각합니다. – MSumulong

1

매크로는 전처리/컴파일러 위해 예약되어 있습니다 : GNU CC로, 당신은이 같은이 .c [PP] 파일의 "-E"옵션을 사용해야합니다.

__ * _ H을 (를)보다 표준적인 것으로 변경해보십시오.
HAVE __ * _ H를 사용합니다.

+0

매크로는 어디 까지나 밑줄이 있거나 밑줄을 두 번 사용합니다 (C++에만 해당). C/C++에서 예약 된 이름의 형태를 논의하는 몇 가지 항목이 있습니다. –

+0

@gnud : C++ 호환성을 위해 이중 밑줄을 사용하지 말고 (약간 단순하게) 맨 밑줄은 구현에 예약되어 있습니다. 다른 곳에서는 싱글 언더 스코어를 사용할 수 있습니다. –

+0

예, 나는 밑줄 문자를 의미했습니다. 지금 수정 수정 중. – gnud

1

그래야합니다. 그것은 당신의 예제에서 올바르게 쓰여지고 나를 위해 잘 컴파일됩니다. 실제 코드에서 잘못 입력 했습니까? 아니면 실제로보고있는 다른 문제입니까?

컴파일러 및/또는 시스템 라이브러리 용으로 예약되어 있으므로 __로 시작하지 않아야합니다. 경호원에게 다른 이름을 사용해보십시오.

0

이것은 작동합니다.

확실히, 필자는 실제로 3 개의 헤더 파일과 함께 a.h가 포함 된 test.c를 컴파일했습니다.

MSVC, 디지털 화성 및 GCC의 여러 버전에서이 기능이 작동하는지 확인했습니다.

1

나중에 터보 C에서 작업하면서이 소스 파일을 사용하여 프로젝트를 수행하는 경우 소스 파일에 # 포함 된 헤더 파일을 첨부하지 마십시오. 일부 컴파일러 옵션은 이러한 오류를 반복해서 제공하기 때문에 명령 프롬프트에서 시도해보십시오. 헤더 파일 내용이 #ifndef와 #endif 사이에 있으면 두 파일을 모두 포함해도 문제가 없습니다. 그래서 같은 directory.bcos에서 그들을 지키는 프로젝트에서 헤더 파일을 제거하려고 U 터보 C 지정 된 환경을 내가 헤더 파일을 가진 터보 C에 한 번이 상황에 직면했기 때문에 # 소스 파일에 포함 된 및 프로젝트 파일 목록에 첨부 된 그럼에도 "여러 선언 문제"가 발생합니다. 컴파일 후 (심지어 오류 포함) 외부 명령 행으로 이동하여 해당 파일이 저장된 디렉토리로 가서 직접 filename.exe로 시도하십시오.