2009-10-31 2 views
321

나는 보통 헤더 파일의 시작에 같은 코드를보고되었습니다 C++ 헤더 파일에 #ifndef 및 #define이 사용되는 이유는 무엇입니까?

#ifndef HEADERFILE_H 
#define HEADERFILE_H 

그리고 파일의 끝에

#endif 

이것의 목적은 무엇입니까?

+22

+1 - 나도 같은 의심의 여지가 있었고, 여기 더 좋은 대답을 얻었고, 미래의 방문자에게 유용 할 수 있습니다 : http://stackoverflow.com/q/3246803/1134940 –

+5

나는 이것을 추가하고 싶습니다. 또한 ** #pragma once **를 사용하십시오. 그 작업은 ifndef와 동일한 목적으로 사용됩니다. 두 가지를 비교하려면 다음을 참조하십시오. http://stackoverflow.com/questions/1143936/pragma-once-vs-include-guards – Dimension

+2

'#pragma'가 무엇인지 언급하는 것이 가장 좋습니다 : 컴파일러 관련 기능을 활성화합니다. #pragma once는 광범위하게 지원되지만, 비표준입니다. – Potatoswatter

답변

369

이들을 #include guards이라고합니다.

헤더가 포함되면 고유 값 (이 경우 HEADERFILE_H)이 정의되어 있는지 확인합니다. 그런 다음 정의되지 않은 경우이를 정의하고 페이지의 나머지 부분을 계속합니다.

코드가 다시 포함되면 첫 번째 ifndef이 실패하여 빈 파일이됩니다.

이렇게하면 형식, 열거 형 및 정적 변수와 같은 식별자가 두 번 선언되지 않습니다.

+3

Mmm interresting. 나는 VC++ 사상 처음으로 두 번 정의한 것에 대한 오류를 알려 주었다.Nevermind 나는 Objective-C 코더이다.) –

+0

Koning Baard XIV : VC도 같은 것을하는'#pragma once'를 가지고있다 :-) – Joey

+63

또한 재귀 적 포함을 막는다 ... "alice.h"가 " bob.h "와"bob.h "에는"alice.h "가 포함되어 있으며 경비원은 포함되어 있지 않습니다. –

21
#ifndef <token> 
/* code */ 
#else 
/* code to include if the token is defined */ 
#endif 

#ifndef 검사 주어진 토큰 이전 파일 또는 파일에 포함 #defined을되었는지 여부; 그렇지 않은 경우 코드와 #else 사이의 코드가 포함되거나 #else이없는 경우 #endif 문이 포함됩니다. #ifndef은 파일이 포함되면 토큰을 정의하고 해당 파일의 맨 위에 토큰이 설정되지 않았는지 확인하여 헤더 파일을 멱등 원으로 만드는 데 자주 사용됩니다.

#ifndef _INCL_GUARD 
#define _INCL_GUARD 
#endif 
+3

밑줄로 시작하는 식별자는 예약되어 있습니다. 당신 스스로 정의해서는 안됩니다. '#ifndef H_HEADER_NAME'과 같은 것을 사용하십시오. –

+5

이것은 오래된 주석이지만 실제로 밑줄 제한은 "외부 식별자"- 컴파일 된 객체의 심볼 테이블에서 끝날 수있는 식별자, 즉 전역 변수 및 함수 이름에만 적용됩니다. 매크로 이름에는 적용되지 않습니다. – Stu

+1

Stu의 의견이 사실입니까? 방금 https://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier를 읽었으며 지금은 확실하지 않습니다. – Will

2

이렇게하면 동일한 헤더 파일을 여러 번 포함 할 수 없습니다.

#ifndef __COMMON_H__ 
#define __COMMON_H__ 
//header file content 
#endif 

이 헤더 파일을 여러 파일에 포함 시켰다고 가정합니다. 따라서 처음으로 __COMMON_H__이 정의되지 않았 으면 정의되고 헤더 파일이 포함됩니다.

다음 번에 __COMMON_H__이 정의되므로 다시 포함되지 않습니다.

관련 문제