2013-05-30 3 views
2

두 개의 헤더 파일 (/directory1/A.hppdirectory2/A.hpp)이 있다고 가정 해보십시오. 이 두 헤더의 내용은 입니다.!다른 포함 경로의 동일한 헤더 파일

빌드 타겟 A.cpp은 포함 경로로 directory1directory2이 필요합니다. 두 디렉토리에 필요한 다른 헤더 파일이 있기 때문입니다.

이제 A.cpp에는 #include "A.hpp" 문이 있습니다.

전처리 기는 어떤 버전의 A.hpp을 선택할 것입니까?

타사 소프트웨어를 사용하는 경우 그러한 상황이 발생할 가능성이 있습니까?

+1

필자는 컴파일러가'# include' 줄을 파일의 내용으로 바꾼다고 생각하기 때문에 이름은 중요하지 않습니다. – Djon

+1

'#pragma once' 또는 포함 가드를 사용하면 내용은 한 번만 삽입되기 때문에 중요하지 않습니다. –

+0

죄송합니다. 두 헤더 파일이 다른 경우 어떻게되는지 언급하지 않았습니다. 편집을 참조하십시오. – Juergen

답변

9

이 경우 발생하는 문제는 해당 컴파일러에 따라 다릅니다 (사용하는 컴파일러의 설명서 참조).

"적합하지 않은"헤더 이름을 사용하는 것이 일반적으로 좋지 않은 이유입니다. 경로의 일부를 이름의 필수 구성 요소로 남겨 두려면 항상 include 디렉토리를 구성하십시오. 예 : 대신

#include <preprocessor.hpp> 
#include <GL.h> 
3

컴파일 옵션, 특히 포함 경로에 따라 다릅니다.

directory1이 포함 경로에 있으면 , 그렇지 않으면 디렉토리 2가 포함 경로에있는 경우 /directory2/A.hpp이됩니다. directory1과 directory2가 모두 포함 경로에 있으면 컴파일러에서 #include "directory1/A.hpp"과 같은 디렉토리를 지정하라는 메시지를 표시합니다.

+3

마지막 사례에서 아무 것도 지정하지 않겠습니다. "처음 발견됨"(일반적으로 포함 디렉토리 목록에 나열된 첫 번째 의미). –

4

큰 따옴표가있는 include 지시문은 리터럴 형식으로 참조되는 파일을 붙여 넣습니다. 파일 경로는 소스 파일 위치에 상대적이라고 간주됩니다.

따라서 #include "directory1/A.hpp"이있는 경우 명백한 것을 포함하게됩니다. #include <A.hpp> 또는 #include "A.hpp" 인 경우 검색 경로의 첫 번째 항목에 따라 달라집니다.

일반적으로 여기에는 논쟁을 피하기 위해 구체적이고 설명적인 이름이 있어야합니다. 디렉토리를 사용하는 것은 C++ 네임 스페이스를 사용하는 것과 같은 방식으로 충분합니다. libxml ++ 및 gtkmm과 같은 라이브러리 구조를 살펴보십시오.

1

#include <boost/preprocessor.hpp> 
#include <gl/GL.h> 

는 컴파일러 후비는 포함 디렉토리가 -I에 인수로 나열된 순서대로 파일이 포함됩니다. 발견 된 첫 번째 파일이 사용됩니다.

동일한 이름의 파일이 두 개있는 경우 원본 파일에 원하는 파일을 지정해야합니다.

관련 문제