|
cele 님이 쓰신 글 :
: 밑부분에 보면
:
: #if !defined(__USING_STD_NAMES__) && defined(__cplusplus)
: using namespace std;
: #endif /* __USING_STD_NAMES__ */
:
: 이렇게 정의 되어 있는데요,
: 실제로 <iostream> 을 불러다 쓸때
:
: using namespace std;
:
: 이걸 안쓰면 안되는게 이해가 안되거든요.
: 전처리 조건도 분명 맞는데.. 왜 그럴까요?
:
#if !defined(__USING_STD_NAMES__) && defined(__cplusplus)
using namespace std;
#endif /* __USING_STD_NAMES__ */
에서
__cplusplus는 정의되어 있는 것으로 치면 __USING_STD_NAMES__가 문제가 되는군요.
#include<iostream>을 하면 iostream.h 파일이 include 되기는 하는데
위의 #if에 접어들었을 때 __USING_STD_NAMES__가 이미 define 되어 있습니다.
따라서, using namespace std;가 활성화되지 않습니다.
(iostream.h가 include 되는지 여부는 iostream.h 파일에 문법 오류를 만들어 놓고 컴파일해보면 압니다)
한편, #include<iostream.h>를 하게 되면
위의 #if에 접어들었을 때 __USING_STD_NAMES__가 define 되어 있지 않은 상태입니다.
따라서, using namespace std;가 활성화됩니다.
이것을 알았으면 이제 __USING_STD_NAMES__를 언제 어디에서 왜 define하는지를 찾아보아야 겠습니다.
그런데, 이상한 것은 include 이하 디렉터리의 파일들에서 #define __USING_STD_NAMES__를 아무리 찾아봐도 안 보이네요.
#include<iostream>에서와 같이 확장자가 없는 헤더 파일을 지정하면 빌더가 중간에서 암시적으로 어떤 처리를 하는 것이라 추측이 됩니다만....
실험:
1. test_hdr.h , test_hdr 두 파일 모두 없는 상태에서
#include<test_hdr>하면 test_hdr.h 파일이 없다는 컴파일 오류 메시지가 뜸.
2. include 디렉터리에 test_hdr.h 파일을 새로 만들어 놓고(빈 파일)
#include<test_hdr> 하면 컴파일 오류 안 뜨고 __USING_STD_NAMES__가 자동으로 정의된 상태.
#include <test_hdr.h> 하면 컴파일 오류 안 뜨고 __USING_STD_NAMES__가 정의 안 된 상태.
위의 테스트에서 test_hdr 파일은 아예 만들지 않았습니다.
결과적으로,
1. #include<hdr_file> 형식으로 하면 __USING_STD_NAMES__가 자동으로 정의된 후 hdr_file.h 파일을 include하게 되고
2. #include<hdr_file.h> 형식으로 하면 __USING_STD_NAMES__가 자동으로는 정의되지 않고 hdr_file.h 파일을 include하게 된다는 것을 알 수 있습니다.
|