2012-10-17 3 views
11

파일에 iostream 또는 다른 헤더 파일을 두 번 포함하면 어떻게되는지 알려주십시오. 나는 컴파일러가 오류를 던지지 않는다는 것을 알고있다. 코드가 두 번 추가되거나 내부적으로 어떤 일이 발생합니까? 헤더 파일을 포함하면 실제로 어떻게됩니까?헤더 파일을 C++로 두 번 포함

+1

큰 도움 :: http://www.cplusplus.com/forum/articles/10627/ – Abhineet

답변

10

Include guard은 실제로 컴파일러에서 파일의 내용을 두 번 볼 수 없도록합니다. 당신이 다음 번 매크로 SOME_STRING_H 라운드 처음 파일을 포함하는 경우, 따라서 정의되지 않습니다

#ifndef SOME_STRING_H 
#define SOME_STRING_H 

//... 

#endif 

:

가드는 기본적으로 헤더 파일의 시작과 끝에서 전 처리기의 조건 지시어의 집합입니다 포함 파일의 내용은 컴파일러에서 처리하고 볼 수 있습니다. 그러나 #ifdef 이후의 첫 번째 내용은 #define이므로 SOME_STRING_H이 정의되고 다음 번에 헤더 파일의 내용은 컴파일러에서 볼 수 없습니다.

충돌을 피하기 위해 포함 가드에 사용 된 매크로의 이름은 헤더 파일의 이름에 따라 달라집니다.

+0

참고 사항 : Microsoft 도구를 사용할 때 '#pragma once'와 같은 기능을합니다. '#ifndef ... '. 더 나은 컴파일러 호환성을 위해서는 후자를 사용해야합니다. – AquilaRapax

+0

또한 대부분의 컴파일러는이 패턴을 인식하고 파일을 두 번째로 볼 때 파일을 열지 않습니다. –

+0

이것은 실제로 질문에 대답하지 않습니다. 나는 다른 사람의 코드를보고 있기 때문에 원래의 질문에 흥미가있다. – Frederick

2

그것은 단순히 때문에 다음과 같은 라인을 따라 처리기 코드, 스킵됩니다 : 당신은 두 번 포함하는 경우

#ifndef MY_HEADER_H 
#define MY_HEADER_H 

<actual header code here> 

#endif 

그래서, 다음 MY_HEADER_H가 이미 정의 및 모든 전처리에 의해 생략 된 #ifndef#endif 사이에있다.

3

헤더 파일은 단순한 짐승입니다. #include <header> 일이 발생하면 header의 내용이 기본적으로 파일에 복사 붙여 넣기됩니다. 여러 번 포함되지 헤더를 중지하려면 include guards 대부분의 헤더 파일은 상황에 따라 다르다

#ifndef SOME_HEADER_FILE_GUARD 
#define SOME_HEADER_FILE_GUARD 

//Contents of Header 

#endif 
0

에 가깝다 뭔가를 볼 수 있습니다 이유입니다, 사용됩니다. <assert>을 제외하고 표준에서는 초 (또는 그 이후)에 표준 헤더를 포함시켜야합니다. 그러나 이것은 헤더의 특성 인 입니다. 컴파일러는 (적어도 개념적으로) 이 포함을 발견 할 때마다 모든 헤더 텍스트를 읽고 포함합니다. 이 같은 묶어야합니다 헤더에있는 C++ 코드의 모든 :

이러한 경우 여러 정의를 방지하기위한 표준적인 사용 경비를 포함 이다 분명히

#ifndef SPECIAL_NAME 
#define SPECIAL_NAME 
// All of the C++ code here 
#endif SPECIAL_NAME 

, 각각의 헤더가 필요로하는 다른 이름. 응용 프로그램 내에서 은 일반적으로 파일 이름과 위치에 따라 규칙을 설정할 수 있습니다. subsystem_filename과 같은 문자 ( 파일 이름에서 사용하는 경우)가 C++ 기호에서 유효하지 않은 문자 인 과 매핑됩니다 (대개 대소 문자를 모두 포함). 라이브러리의 경우 가장 합리적인 길이의 임의의 문자 시퀀스를 생성하는 것이 가장 좋습니다. 훨씬 더 자주 (구현 품질의 관점에서 볼 때 이 열등하지만) 이 모든 기호를 문서화 된 접두사로 시작하도록 보장해야합니다.

시스템 라이브러리는 물론 예약 된 기호 (예 :. 밑줄로 시작하여 대문자로 시작하는 기호)는 으로 충돌이 없음을 보장합니다. 또는 완전히 다른 일부 구현 방법 인 을 사용할 수 있습니다. Microsoft는 예를 들어 은 컴파일러 확장자 ​​#pragma once을 사용합니다. g ++는 이 항상 _GLIBCXX (사용자 코드에서 유효한 기호가 아닙니다)으로 시작하는 포함 가드를 사용합니다. 이러한 옵션은 반드시 사용할 수있는 것은 아닙니다.