파일에 iostream 또는 다른 헤더 파일을 두 번 포함하면 어떻게되는지 알려주십시오. 나는 컴파일러가 오류를 던지지 않는다는 것을 알고있다. 코드가 두 번 추가되거나 내부적으로 어떤 일이 발생합니까? 헤더 파일을 포함하면 실제로 어떻게됩니까?헤더 파일을 C++로 두 번 포함
답변
Include guard은 실제로 컴파일러에서 파일의 내용을 두 번 볼 수 없도록합니다. 당신이 다음 번 매크로 SOME_STRING_H
라운드 처음 파일을 포함하는 경우, 따라서 정의되지 않습니다
#ifndef SOME_STRING_H
#define SOME_STRING_H
//...
#endif
:
가드는 기본적으로 헤더 파일의 시작과 끝에서 전 처리기의 조건 지시어의 집합입니다 포함 파일의 내용은 컴파일러에서 처리하고 볼 수 있습니다. 그러나 #ifdef
이후의 첫 번째 내용은 #define
이므로 SOME_STRING_H
이 정의되고 다음 번에 헤더 파일의 내용은 컴파일러에서 볼 수 없습니다.
충돌을 피하기 위해 포함 가드에 사용 된 매크로의 이름은 헤더 파일의 이름에 따라 달라집니다.
참고 사항 : Microsoft 도구를 사용할 때 '#pragma once'와 같은 기능을합니다. '#ifndef ... '. 더 나은 컴파일러 호환성을 위해서는 후자를 사용해야합니다. – AquilaRapax
또한 대부분의 컴파일러는이 패턴을 인식하고 파일을 두 번째로 볼 때 파일을 열지 않습니다. –
이것은 실제로 질문에 대답하지 않습니다. 나는 다른 사람의 코드를보고 있기 때문에 원래의 질문에 흥미가있다. – Frederick
그것은 단순히 때문에 다음과 같은 라인을 따라 처리기 코드, 스킵됩니다 : 당신은 두 번 포함하는 경우
#ifndef MY_HEADER_H
#define MY_HEADER_H
<actual header code here>
#endif
그래서, 다음 MY_HEADER_H
가 이미 정의 및 모든 전처리에 의해 생략 된 #ifndef
및 #endif
사이에있다.
헤더 파일은 단순한 짐승입니다. #include <header>
일이 발생하면 header
의 내용이 기본적으로 파일에 복사 붙여 넣기됩니다. 여러 번 포함되지 헤더를 중지하려면 include guards
대부분의 헤더 파일은 상황에 따라 다르다
#ifndef SOME_HEADER_FILE_GUARD
#define SOME_HEADER_FILE_GUARD
//Contents of Header
#endif
에 가깝다 뭔가를 볼 수 있습니다 이유입니다, 사용됩니다. <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
(사용자 코드에서 유효한 기호가 아닙니다)으로 시작하는 포함 가드를 사용합니다. 이러한 옵션은 반드시 사용할 수있는 것은 아닙니다.
- 1. log4net 로그 헤더 두 번
- 2. 은 C로 헤더 파일을 포함하고 컴파일합니다.
- 3. 헤더 파일을 여러 번 포함하는 C++ 재정의
- 4. 포함 된 파일에 같은 파일을 두 번 포함시키지 않으려면 어떻게합니까?
- 5. Objective-C로 SWF 헤더 읽기
- 6. 같은 파일을 두 번 같은 함수 이름으로 두 번 포함합니다.
- 7. 다른 헤더 파일에 헤더 포함
- 8. C로 파일을 완전히 닫으십시오.
- 9. 헤더 파일을 포함 할 수 없습니다.
- 10. 정의되지 않은 참조 - 헤더 파일을 포함
- 11. 헤더 파일을 포함 할 수 없습니까?
- 12. `Scheduler :: _ singleton '의 다중 정의, 두 번 헤더 가져 오기
- 13. 클래스 헤더 및 구현에 헤더 포함?
- 14. 헤더 포함 문제
- 15. 배치 파일을 C로 작성 #
- 16. 헤더 파일 포함
- 17. 템플릿 헤더 포함 해결책
- 18. 헤더 포함 및 사용
- 19. 하나는 같은 파일을 두 번 가져올까요?
- 20. Codeigniter가 동일한 파일을 두 번 업로드합니다.
- 21. CakePHP는 .ctp 파일을 두 번 실행합니다.
- 22. 파일을 복사하기 위해 프로젝트를 두 번 컴파일해야합니다.
- 23. (DDK 헤더 포함)
- 24. 슬래시가 포함 된 #include 문 (두 부분으로 구성된 헤더 파일)
- 25. -Wmissing - - DIRS 포함 & 자동으로 포함 헤더 디렉토리
- 26. 헤더/라이브러리 포함
- 27. 헤더 포함 문제
- 28. 헤더 파일에 포함
- 29. 헤더 파일의 상호 포함
- 30. 두 번
큰 도움 :: http://www.cplusplus.com/forum/articles/10627/ – Abhineet