인라인이 무엇인지 알기(exceptional C++ 에 무척 자세히 나온다: 항목 25 : inline 해부 http://www.ikpil.com/821)기 때문에 생략 한다. 템플릿의 특성상 번역단위마다 코드 인스턴스화가 일어 나지만, 동일한 인스턴스일 때는 단 1개의 정의로 컴파일러는 관리 한다. 그러므로 대부분의 컴파일러에서 "재정의 오류"가 일어나지 않는다. 일어 나는 컴파일러도 있다고 책에 적혀 있지만, 그건 프로그래머 잘못이 아니다. .. 그러므로 프로그래머는 당장 컴파일러를 바꾸어야 한다.(이건 책에 내용이 없다 : ) ) 하여튼, 번역단위마다 코드 인스턴스화가 일어 난다고 해서 자동으로 인라인이 된다고 착각 할 수 있다. 이 착각은 인라인과 동일하게 번역 단위마다 코드 붙이기가 일어 난다고..
2009/06 검색 결과
템플릿 코드를 작성 하는 것은 , 일반 코드와 다르다. 이 다름에는 여러가지가 있지만, 컴파일러가 코드를 컴파일 하는 시점이 일반 코드와 다른 것이 이뜸이지 않을까 한다. 컴파일러는 어떻게 인식 하는가? 일반 코드의 경우 1. .h, hpp, hxx, 라는 파일에 선언을 넣어 둔다. 이런 파일을 우리는 헤더 파일이라 부른다. 2. cpp, c, cxx 파일에 정의를 넣어 둔다. 이런 파일을 우리는 C 파일이라 부른다. 이러한 헤더파일과 C파일을 컴파일러가 컴파일하게 되는데, 이러한 결과물을 OBJ 파일이라 한다. OBJ 파일은 단순한 기계어 파일인데, 이러한 OBJ 파일들을 링커가 서로 연결해 주고, 스타트업 코드를 넣어 주면서 실행 파일이 만들어 진다. 템플릿 코드는 바로 이 부분이 다르다. OBJ 파..
로컬 클래스란 지역 클래스를 말한다. ... 지역 클래스라 하니 좀 그런데, 지역 변수 처럼, 지역에서만 쓰일 수 있는 클래스를 말한다. 역시 코드로 정리하는게 빠르겠다. void f() { class LocalClass { // ..... 정의 }; LocalClass d; // .. 이용한다. } 위에선 함수안에 로컬 클래스를 정의 했지만, 클래스 내부도 가능하고 { } 안에서도 가능하다. 비슷한 개념으로 함수안에 함수를 정의할 수 있지 않을까? 라고 생각 했다면, 당신은 이미 센스 쟁이이다. 하지만 안타깝게도 C++에선 지원해 주지 못한다. 어찌되었든,책의 내용을 인용하자면 "로컬 클래스는 새로운 이론을 가능하게하는 기법은 아니지만 구현을 단순화 시키고, 심볼의 지역성을 높여주는 데 기여하는 기법"..
템플릿의 부분 특화(Partial Template Specialization)란 그 템플릿이 구체화 가능한 인스턴스화 중 특정 부분 집합에 대응 시키는 것을 뜻한다. ..,, 말이 좀 어렵다. 아무리 생각해도 이 말은 좀 어렵다. 다시 해석 하자면, "만약 템플릿 파라미터가 A 라면, 이 템플릿 코드를 인스턴스화 해라" 라고 정하는게 템플릿 특화 이고, "만약 템플릿 파라미터들 중 첫번째가 A 라면, 이 템플릿 코드를 인스턴스화 해라" 이것이 템플릿 부분 특화 이다. 그럼 코드로 정리해 보자 // 아래 코드는 일반적인 클래스 템플릿 코드이다. template class Widget { // 일반화 시킬 구현 코드 }; // 아래 코드는 위의 클래스 템플릿을 특수화 시킨 코드이다. template clas..
내가 컴파일 타임 어써션(Compile-time assertions)을 처음 써 본것은 BOOST를 알고서 부터였다. 컴파일 타임에 정말 많은 것을 할 수 있다는 계기가 된 함수(?) 인데, 다음 코드를 컴파일 할 때 어떤 경고가 뜨는지 한번 보면, 짭짜른 맛이 느껴지면서, 자꾸 먹고 싶어 진다. #include int main( void ) { BOOST_STATIC_ASSERT( 1 == 1 ); BOOST_STATIC_ASSERT( 1 == 0 ); return 0; } 6번째 라인에서 컴파일이 되지 않는 것을 알 수 있는데, 이게 바로 BOOST_STATIC_ASSERT 이다. 쓸 수 있는 곳은 무궁무진하다. 예를 들어서, 캐스팅 함수를 만든다고 치자, 작은 타입에서 큰 타입으로 캐스팅 하는건 자..
UTF-16과 USC2 환경에서 영문이라고 인정 값들은 0x0000 ~ 0x0080 까지 이다. 여기에 리틀엔디안 환경이라면, 상위 바이트와 하위 바이트가 뒤 바뀌므로, 다음과 같다. 0x0000 ~ 0x8000 그러므로 이것을 기준으로 판단 코드를 작성하면 다음과 같다. // 출처 : ikpil.com #include template struct char_type; template struct char_type { typedef unsigned char type; }; template struct char_type { typedef unsigned short type; }; int main( void ) { wchar_t a = L'ㄲ'; typedef char_type::type custom_char..
최근댓글