C++ 에서 C 표준함수들은 std namespace 에 있는 건가요?
글쓴이: winner / 작성시간: 금, 2007/09/28 - 11:43오후
우선 cassert를 include하면 std::assert가 아닌 assert를 호출해야 합니다.
아마도 assert가 macro이기 때문이겠지요.?
그런데 cctype을 include하면 std::isalpha를 호출해도 되고, isalpha를 호출해도 됩니다.
단지 호환성을 위해서 이렇게 해 놓은 것인지, 아니면 C++ 표준이 둘다를 받아들이고 있는지 궁금하네요.
한가지 더. 만약 isalpha가 std namespace에 있다면 functional을 include한 후
인자기반 namespace 검색에 의해서 ptr_fun(std::isalpha)를 해도 되어야 할텐데
std::ptr_fun(isalpha)나 std:ptr_fun(std::isalpha)를 해야되는군요.
그나마 g++ 4.1.2 에서 둘 다 가능하고
MinGW 의 g++ 3.4.2 에서는 std::ptr_fun(std::isalpha) 는 오류를 냅니다.
이부분에서 잘 아시는 분 없나요?
Forums:
표준에 따르면
표준에 따르면 매크로와 operator new, operator delete 이외의 모든 라이브러리 entity는 std 또는 그 하위 namespace에 정의됩니다.
Koenig lookup시에
Koenig lookup시에 인자가 함수이면 관련 namespace는 해당 함수의 인자 및 반환값에 관련된 것입니다. 즉 위의 경우 isalpha의 인자와 반환값이 모두 int이므로 관련 namespace가 없는 것입니다.
음.. 좀더 해봤는데요.
우선 kewlbear님의 설명은 감사합니다.
그런데 제가 임시로 만들었는데 MinGW g++ 3.4.2에서도
std::ptr_fun(std::isalpha)가 되는군요.
이상한 점은 원래 문제가 되었던 code인
last = find_if(first, subex.end(), not1(std::ptr_fun(std::isalpha))); 는 오류를 냅니다.
g++ 4.1.2에서도 오류가 납니다.
하지만 거기서 isalpha 앞의 std::를 빼면 문제없이 compile 되는군요...
왜 이런 현상이 발생하는지 설명이 가능할까요?
아래 코드로 gcc
아래 코드로 gcc 4.0.3/4.1.2/3.4.2(mingw)에서 테스트 해봤는데 컴파일 잘 됩니다.
하도 이상해서 여러가지로 시도해봤습니다.
범인은 iostream이군요... -_-
iostream을 include 하면 오류를 냅니다.... 버엉~~~~
댓글 달기