다음을 통해 공유


표준 C++ 라이브러리 변경 내용: 업그레이드 문제

업데이트: 2007년 11월

다음 항목에서는 이전 응용 프로그램과 새 런타임 라이브러리에서 발생할 수 있는 문제점을 다룹니다.

  • iostream 구현의 문제점

  • 기본 라이브러리 없이 빌드된 이전 프로젝트

  • 표준 C++ 라이브러리에 사용되는 C++ 예외 처리

iostream 구현의 문제점

Visual C++ .NET 2003에서는 이전의 iostream 라이브러리가 제거되었습니다.

표준 C++ 라이브러리와 이전 런타임 라이브러리의 주요 차이점은 iostream 라이브러리에 있습니다. iostream 구현에 관한 세부 내용이 변경되었으므로 표준 C++ 라이브러리에 링크하려면 iostream을 사용하는 일부 코드를 다시 작성해야 합니다.

코드에 포함시킨 이전 iostream 헤더(fstream.h, iomanip.h, ios.h, iostream.h, istream.h, ostream.h, streamb.h 및 strstrea.h)를 모두 제거하고, 한 개 이상의 새 표준 C++ iostream 헤더(<fstream>, <iomanip>, <ios>, <iosfwd>, <iostream>, <istream>, <ostream>, <sstream>, <streambuf> 및 <strstream>이며 모두 .h 확장명 없음)를 추가해야 합니다.

다음 목록에서는 이전 iostream 라이브러리의 동작과 다른 새 표준 C++ iostream 라이브러리의 동작에 대해 설명합니다.

새 표준 C++ iostream 라이브러리에서

  • open 함수는 보호 매개 변수인 세 번째 매개 변수를 갖지 않습니다.

  • 파일 핸들로부터 스트림을 만들 수 없습니다.

  • 두 가지 예외도 있지만 새 표준 C++ 라이브러리의 모든 이름은 std 네임스페이스에 있습니다. 자세한 내용은 Using C++ Library Headers을 참조하십시오.

  • ofstream 개체를 ios::out플래그만으로 열 수는 없습니다. ios::out 플래그는 논리 OR를 사용하여 ios::in 또는 ios::app 등의 다른 ios 열거자와 결합해야 합니다.

  • ios::good은 파일 끝에 도달하면 eofbit 상태가 설정되기 때문에 더 이상 0이 아닌 값을 반환하지 않습니다.

  • 기본 플래그가 현재 아무 것도 설정되지 않았다는 사실을 모른다면 ios::setf(_IFlags)를 ios::dec, ios::oct 또는 ios::hex의 플래그 값과 함께 사용할 수 없습니다. 서식이 지정된 입/출력 함수와 연산자는 기본만 설정된 것으로 간주합니다. 그 대신, ios_base를 사용하십시오. 예를 들어, setf( ios_base::oct,ios_base::basefield )는 모든 기본 정보를 제거한 다음 기본을 8진수로 설정합니다.

  • ios::unsetf는 이전 값 대신 void를 반환합니다.

  • istream::get( char& _Rch )은 오류가 발생할 경우 Rch에 할당하지 않습니다.

  • istream::get( char* _Pch, int _Ncount, char_Delim )은 다음 세 가지로 나뉩니다.

    • 아무 것도 읽지 못한 경우 failbit가 설정됩니다.

    • eos는 항상 문자가 추출된 다음 저장되는데, 이는 결과와 관계없이 발생합니다.

    • _Ncount에 대해 –1의 값은 오류입니다.

  • 잘못된 매개 변수를 가진 istream::seekgfailbit를 설정하지 않습니다.

  • 반환 형식 streampos는 오버로드된 연산자가 있는 클래스입니다. streampos 값(istream::tellg, ostream::tellp, strstreambuf::seekoff, strstreambuf::seekpos 등)을 반환하는 함수에서 필요한 형식의 반환 값을 캐스팅해야 합니다. 예를 들면, streamoff, fpos_t, mbstate_t 등이 있습니다.

  • strstreambuf::strstreambuf( _Falloc**,** _Ffree )의 첫 번째 매개 변수(_Falloc)는 long이 아닌 size_t 인수를 가집니다.

위 변경 내용 외에도 이전 iostream 라이브러리의 요소인 다음의 함수, 상수 및 열거자는 새 iostream 라이브러리의 요소가 아닙니다.

  • filebuf, fstreamifstreamofstreamattach 멤버 함수

  • filebuf, fstreamifstreamofstreamfd 멤버 함수

  • filebuf::openprot

  • filebuf::setmode

  • ios::bitalloc

  • ios::nocreate

  • ios::noreplace

  • ios::sync_with_stdio

  • streambuf::out_waiting

  • streambuf::setbuf(같은 동작에 대해 rdbuf -> pubsetbuf 사용)

기본 라이브러리 없이 빌드된 이전 프로젝트

/NODEFAULTLIB를 선택하면 기본 라이브러리 없이 프로젝트를 빌드할 수 있습니다. 이전 프로젝트가 기본 라이브러리 없이 빌드된 경우 iostream을 호출하려면, 새 표준 C++ 런타임 라이브러리(Libcp.lib, Libcpmt.lib, Msvcprt.lib 등) 중 하나의 이름을 지정하거나 이전 iostream 런타임 라이브러리(Libci.lib, Libcimt.lib, Msvcirt.lib 등) 중 하나의 이름을 지정하여 적절한 라이브러리에 링크해야 합니다.

이전 Visual C++ 버전(4.1 및 그 이전)의 런타임 라이브러리 이름은 Libc.lib, Libcmt.lib 및 Msvcrt.lib입니다. 이러한 라이브러리에는 이전 iostream 라이브러리가 포함되어 있었지만 이제는 제거되었습니다. 기본 라이브러리를 무시하지 않고 이전 iostream 헤더 파일을 코드에 포함시킬 경우 이전 iostream 런타임 라이브러리(Libci.lib, Libcimt.lib, Msvcirt.lib 등)가 기본적으로 링크됩니다. 그러나, 기본 라이브러리를 무시하고 이전 런타임 라이브러리 중 하나를 수동으로 추가한 경우 iostream 호출이 중단됩니다.

표준 C++ 라이브러리에 사용되는 C++ 예외 처리

표준 C++ 라이브러리를 사용하는 파일은 모두 C++ 예외 처리를 사용하여 컴파일되어야 합니다. 자세한 내용은 /GX를 참조하십시오.

참고 항목

개념

표준 C++ 라이브러리 변경 내용