표준 C++ 라이브러리에 대한 질문과 대답

이 문서에서는 표준 C++ 라이브러리에 대한 FAQ(질문과 대답) 목록과 해당 질문에 대한 답변을 제공합니다.

원래 제품 버전: Visual C++
원본 KB 번호: 154419

표준 C++ 라이브러리에 포함된 항목

표준 C++ 라이브러리는 확장 가능한 프레임워크를 제공하며 언어 지원, 진단, 일반 유틸리티, 문자열, 로캘, 표준 템플릿 라이브러리(컨테이너, 반복기, 알고리즘 및 숫자) 및 입력/출력을 위한 구성 요소를 포함합니다.

표준 C++ 라이브러리는 다음 범주로 나눌 수 있습니다.

  1. STL(표준 템플릿 라이브러리) 구성 요소는 가장 널리 사용되는 알고리즘 및 데이터 구조의 하위 집합에 액세스할 수 있는 C++ 프로그램을 제공합니다. STL 헤더는 다음 세 가지 주요 구성 개념으로 그룹화할 수 있습니다.

    • 컨테이너: , setlistmapdequequeuestack및 와 같은 vector데이터를 구성하는 일반적인 방법을 지원하는 템플릿 클래스입니다.

    • 알고리즘: 함수, 알고리즘 및 숫자와 같은 개체 시퀀스에서 일반적인 작업을 수행하기 위한 템플릿 함수입니다.

    • 반복기: 유틸리티, 반복기 및 메모리와 같은 알고리즘과 컨테이너를 함께 붙여넣는 접착제입니다.

  2. 입력/출력에는 (iosfwd), 미리 정의된 iostreams 개체(), 기본 iostreams 클래스(iostream), 스트림 버퍼링(ios), 스트림 서식 및 조작자(streambuf, , istream), ostream문자열 스트림() 및 파일 스트림(iosmanipfstreamsstream)의 정방향 선언 iostreams 을 위한 구성 요소가 포함됩니다.

  3. 다른 표준 C++ 헤더는 다음과 같습니다.

    • 언어 지원: 라이브러리(), 미리 정의된 형식limits의 특성(cstddef, cfloat, climits), C++ 프로그램의 시작 및 종료를 지원하는 함수(), 동적 메모리 관리 지원(cstdlib), 동적 형식 식별 지원(new), 예외 처리 지원(typeinfo) 및 기타 런타임 지원(exceptioncstdarg, ctime, , csetlmpcsignal)에 사용되는 공통 형식 정의에 대한 구성 요소입니다.

    • 진단: 여러 종류의 예외적 조건(), 프로그램 어설션 문서화(stdexcept) 및 오류 번호 코드(cassert)에 대한 전역 변수를 보고하기 위한 구성 요소입니다cerrno.

    • 문자열: 문자열 클래스(string) 및 null로 종료된 시퀀스 유틸리티(cctype, , cwctypecwchar)에 대한 구성 요소입니다.

    • 지역화: C++ 프로그램에서 문화적 차이를 캡슐화하는 데 사용할 수 있는 구성 요소입니다. 로캘 기능에는 문자 분류 및 문자열 데이터 정렬, 숫자, 통화, 날짜/시간 서식 및 구문 분석, 메시지 검색(locale, clocale)에 대한 국제화 지원이 포함됩니다.

CRT와 표준 C++ 라이브러리의 차이점은 무엇인가요? 런타임 라이브러리 컴파일러 옵션에는 어떤 라이브러리가 포함됩니다.

Visual C++에는 MFC(Microsoft Foundation Classs) 라이브러리 외에 다음 라이브러리가 포함됩니다.

  • 기본 C-런타임 라이브러리
  • 표준 C++ 라이브러리
라이브러리 형식 및 관련 컴파일러 스위치 기본 C 런타임 라이브러리/표준 C++ 라이브러리
단일 스레드(/ML) LIBC. LIB / LIBCP. Lib
단일 스레드 디버그(/MLd) LIBCD. LIB / LIBCPD. Lib
다중 스레드(/MT) LIBCMT. LIB / LIBCPMT. Lib
다중 스레드 디버그(/MTd) LIBCMTD. LIB / LIBCPMTD. Lib
다중 스레드 DLL(/MD) MSVCRT. LIB / MSVCPRT. Lib
다중 스레드 /DLL 디버그(MDd) MSVCRTD. LIB / MSVCPRTD. Lib

참고

  • Visual C++에서 정적으로 단일 스레드 라이브러리에 대한 /ML/MLd 라이브러리 컴파일러 옵션이 제거되었습니다.
  • MSVCPRT.libMSVCPRTD.lib 는 정적 라이브러리이며 이와 직접 관련된 DLL(동적 링크 라이브러리)이 없습니다. 이러한 라이브러리는 각각 MSVCRT.libMSVCRTD.lib에 따라 달라집니다. MSVCPRT.lib 또는 MSVCPRTD.lib를 사용하는 애플리케이션이 있고 기본 라이브러리 무시(/NOD 또는 NODEFAULTLIB) 옵션을 사용하는 경우 MSVCPRT.lib(또는 MSVCPRTD.lib) 및 MSVCRT.lib(또는 MSVCRTD.lib)를 애플리케이션과 연결해야 합니다. 그렇지 않으면 애플리케이션을 연결할 때 링커 오류(LNK2001: MSVCPRT.lib 또는 MSVCPRTD.lib에서 해결되지 않은 외부)가 발생합니다. 코드에서 사용하는 헤더에 따라 표준 C++ 라이브러리의 라이브러리도 연결될 수 있습니다.

헤더 파일 use_ansi.h에는 표준 C++ 라이브러리를 강제로 연결하도록 하는 문이 포함되어 #pragma 있습니다. 모든 표준 C++ 헤더에는 use_ansi.h가 포함됩니다. 애플리케이션에 표준 C++ 헤더를 포함하면 표준 C++ 라이브러리가 기본적으로 연결됩니다.

표준 C++ 헤더

열 1 열 2 열 3 열 4
알고리즘 Bitset 복잡 Deque
예외 FSTREAM 기능 IOMANIP
Ios IOSFWD Iostream Istream
반복기 제한 목록 로캘
지도 메모리 숫자 OSTREAM
QUEUE 설정 SSTREAM 스택
STDEXCEPT STREAMBUF STRING STRSTREAM
TYPEINFO 유틸리티 Valarray 벡터

이전 버전에서 프로젝트를 이식하는 경우 Visual C++ .NET 2003 또는 이전 버전에서 이전 'iostream' 기능을 유지하는 방법

이전 iostream 라이브러리(iostream.h)를 유지하려면 코드에 하나 이상의 이전 iostream 헤더 파일을 포함합니다. 새 표준 C++ 헤더를 사용하지 마세요. 이전 iostream 라이브러리와 새 표준 C++ 라이브러리에 대한 호출을 혼합할 수 없습니다.

표준 C++ 라이브러리를 내 애플리케이션의 기본 라이브러리로 만드는 방법

표준 C++ 라이브러리를 기본값으로 설정하려면 하나 이상의 새 표준 C++ 헤더를 포함합니다. 이전 iostream 및 새 표준 C++ 라이브러리에 대한 호출을 혼합할 수 없습니다. 기존 iostream 함수를 사용하는 기존 라이브러리(정적 또는 동적 링크)는 표준 C++ 라이브러리 iostream 함수를 사용하도록 수정해야 합니다.

MFC 애플리케이션에서 표준 C++ 라이브러리를 사용하는 경우 C-런타임 라이브러리와 충돌이 발생합니다.

아니요. MFC(Microsoft Foundation Classs)는 표준 C++ 라이브러리와 충돌하는 C-런타임 함수를 사용하지 않습니다.

'iostream'을 포함했더라도 오류가 발생하는 이유(오류 C2065: 'cout'' : 선언되지 않은 식별자)

표준 C++ 라이브러리는 자체 네임스페이스 std에서 구현됩니다. 프로그램 시작 부분에 다음 문을 추가해야 합니다.

using namespace std;

또는 네임스페이스를 사용하여 각 표준 C++ 라이브러리 식별자를 한정 std합니다(예: std::cout).

오류가 발생하는 이유(컴파일러 오류 C2371: 'identifier' 재정의, 다른 기본 형식)

Visual C++ 2005 이전 버전의 Visual C++에서 표준 C++ 헤더와 이전 iostream 헤더를 혼합하면 다른 원본 파일에 포함되더라도 이 오류가 발생합니다. 다른 헤더는 다음과 같습니다.

  • 이전 iostream 헤더:

    열 1 열 2
    FSTREAM. H IOMANIP. H
    Ios. H Iostream. H
    Istream. H OSTREAM. H
    STDIOSTR. H STREAMB. H
    STRSTREA. H
  • 표준 C++ 헤더:

    열 1 열 2 열 3 열 4
    알고리즘 Bitset 복잡 Deque
    예외 FSTREAM 기능 IOMANIP
    Ios IOSFWD Iostream Istream
    반복기 제한 목록 로캘
    지도 메모리 숫자 OSTREAM
    QUEUE 설정 SSTREAM 스택
    STDEXCEPT STREAMBUF STRING STRSTREAM
    TYPEINFO 유틸리티 Valarray 벡터

메시지가 표시되는 이유(LNK2001: 프로젝트가 기본 라이브러리 무시를 사용하여 빌드될 때 'iostream' 함수 호출에서 해결되지 않은 외부 기호 'symbol';)

iostream 함수가 C-Runtime 라이브러리에서 제거되었습니다.

이전 iostream 함수를 사용하는 경우 다른 라이브러리 LIBCI.lib (단일 스레드 ML), LIBCIMT.lib (다중 스레드 MT) 또는 MSVCIRT.lib (다중 스레드 dll MD)를 추가해야 합니다. 이러한 라이브러리는 Visual C++에서 제거되었습니다.

표준 C++ 라이브러리에 포함된 새 iostream 함수를 사용하는 경우 다른 라이브러리 LIBCP.lib (단일 스레드 ML), LIBCPMT.lib (다중 스레드 MT) 또는 MSVCPRT.lib (다중 스레드 dll MD)를 추가해야 합니다.

다른 버전의 라이브러리를 혼합하지 마세요. 예를 들어 C-Runtime 라이브러리의 단일 스레드 버전을 사용하는 경우 이전 iostream 라이브러리 또는 표준 C++ 라이브러리의 단일 스레드 버전도 사용해야 합니다.

이전 iostream 라이브러리 함수와 새 표준 C++ iostream 라이브러리 함수에 대한 호출을 혼합할 수 없습니다.

컴파일러 경고 C4786 또는 C4788이 표시되는 이유는 무엇인가요? 내 프로그램의 기호 중 어느 것도 길이가 255자 에 가깝지 않습니다.

기호의 이름이 길이가 255자를 초과하면 C4786 또는 C4788이 발급됩니다. 이 문제는 템플릿 클래스에서 자주 발생하며 STL 템플릿 클래스를 광범위하게 사용합니다.

이 경고를 무시해도 안전합니다. #pragma 메시지를 표시하지 않으려면 경고(사용 안 함: 4786,4788)를 사용합니다.

메시지가 표시되는 이유(C4530: C++ 예외 처리기가 사용되었지만 해제 의미 체계는 사용하도록 설정되지 않았습니다. -GX 지정)

표준 C++ 라이브러리를 사용하는 프로그램은 C++ 예외 처리를 사용하도록 설정하여 컴파일해야 합니다. C++ 예외 처리는 다음 방법 중 하나로 사용하도록 설정할 수 있습니다.

  • 프로젝트 설정 대화 상자에서 C/C++ 탭의 C++ 언어 범주에서 예외 처리 사용 옵션을 선택합니다.
  • /GX 컴파일러 스위치 사용.

컴파일러 오류 C2146, C2065, 마지막으로 C2143이 표시되는 이유

이 오류 시퀀스는 다음 유형의 구문으로 인해 발생할 수 있습니다.

vector<int, allocator<int>>iV;

문제는 선언이 끝날 때 연속 >> 된 로 인해 발생합니다. 솔루션은 두 문자 사이에 공백을 배치하여 구문이 됩니다.

vector<int, allocator<int> > iV;

제안된 ANSII 사양과 일치합니다.