2009-09-22 4 views
28

예를 들어 STL 구현의 대부분 구성원은 _M_ 또는 _ 또는 __ 접두어를 사용합니까? 많은 상용구 코드가있는 이유는 무엇입니까?왜 STL 구현을 읽을 수 없습니까? 어떻게 C++을 개선 할 수 있었습니까?

벡터 (예 :) 구현을 명확하고 간결하게 해주는 C++의 기능이 부족합니다.

+0

어떤 STL 구현을 언급하고 있습니까? – morechilli

+7

그리고 구현 세부 사항에 대해 왜 신경 씁니까? –

+2

일부 STL 구현은 간결하게 작성되었습니다. 코드 작성 방법은 표준 범위를 벗어납니다. 구현이 표준을 준수한다는 사실은 대부분의 상황에서 필요한 모든 정보입니다. –

답변

34

구현시 사용자 정의 매크로와의 충돌을 피하기 위해 밑줄로 시작하는 이름과 대문자 또는 밑줄 두 개를 사용합니다. 이러한 이름은 C++에서 예약되어 있습니다. 예를 들어 Type이라는 매크로를 정의한 다음 #include <vector>이라는 매크로를 정의 할 수 있습니다. vector 구현에서 템플릿 매개 변수 이름으로 Type을 사용하면 오류가 발생합니다. 그러나 _Type (또는 __type, type__ 등)이라는 매크로는 정의 할 수 없습니다. 따라서 vector은 이러한 이름을 안전하게 사용할 수 있습니다.

+0

+1 사실. GCC의 구현에는 큐의 기본 컨테이너가 c라고 불리는 이유를 설명하는 주석이 포함되어 있으며 스타일 지침에 따라 "uglified"되지 않습니다. – UncleBens

+2

그래서 C++은 매크로 시스템을보다 강력하게 만들면 개선 될 수 있습니다 :) –

+2

매크로의 네임 스페이스는? – Aardvark

5

많은 STL 구현에는 디버거 빌드 확인 (예 : 두 컨테이너를 비교할 때 같은 컨테이너의 컨테이너 확인, 범위를 벗어나는 반복자의 감시)도 포함됩니다. 여기에는 생성 된 모든 반복자의 컨테이너와 유효성을 추적하는 상당히 복잡한 코드가 포함되지만 버그를 찾는 데는 매우 중요합니다. 이 코드는 STL 알고리즘에서도 #ifdefs가있는 표준 릴리스 코드로 모두 짜여져 있습니다. 따라서 가장 기본적인 작업만큼이나 명확해질 수는 없습니다. this one과 같은 사이트는 STL 알고리즘의 가장 기본적인 기능을 보여 주며 해당 기능이 해당 코드와 "동일"함을 나타냅니다. 당신은 당신의 헤더 파일에서 그것을 볼 수 없을 것이다.

2

robson과 AshleysBrain이 이미 제시 한 좋은 이유 외에도 C++ 표준 라이브러리 구현이 간결한 이름과 압축 코드를 갖는 한 가지 이유는 사실상 모든 C++ 프로그램 (컴파일 유닛)이 많은 표준을 포함한다는 것입니다 따라서 라이브러리 헤더는 반복적으로 재 컴파일됩니다 (C 표준 라이브러리 헤더는 소수의 함수 선언 만 포함하는 반면에 대부분은 인라인 및 템플릿 기반이라는 것을 기억하십시오). "업계 표준"스타일 지침에 따라 작성된 표준 라이브러리는 컴파일하는 데 시간이 오래 걸리므로 특정 컴파일러가 "느린"것으로 인식하게됩니다. 공백을 최소화하고 짧은 식별자 이름을 사용함으로써 렉서와 파서는 할 일이 줄어들고 전체 컴파일 과정이 조금 더 빠릅니다.

언급 할 가치가있는 또 다른 이유는 다양한 표준 라이브러리 준수 (예 : Dinkumware, Rogue Wave (old) 등)가 다양한 표준 준수 및 단점을 지닌 여러 컴파일러와 함께 사용될 수 있다는 점입니다. 지원되는 각 플랫폼을 만족시키기위한 매크로 해킹이 자주 발생합니다.