Standart C++ kitaplığı hakkında sık sorulan sorular

Bu makalede, Standart C++ kitaplıkları hakkında sık sorulan soruların (SSS) bir listesi ve bu soruların yanıtları sağlanır.

Orijinal ürün sürümü: Visual C++
Özgün KB numarası: 154419

Standart C++ kitaplığı ne içerir?

Standart C++ kitaplığı genişletilebilir bir çerçeve sağlar ve dil desteği, tanılama, genel yardımcı programlar, dizeler, yerel ayarlar, standart şablon kitaplığı (kapsayıcılar, yineleyiciler, algoritmalar ve sayısallar) ve giriş/çıkış için bileşenler içerir.

Standart C++ kitaplığı aşağıdaki kategorilere ayrılabilir:

  1. Standart Şablon Kitaplığı (STL) bileşenleri, en yaygın kullanılan algoritmaların ve veri yapılarının bir alt kümesine erişimi olan bir C++ programı sağlar. STL üst bilgileri üç ana düzenleme kavramında gruplandırılabilir:

    • Kapsayıcılar: , , , stackqueuesetdequeve mapgibi vectorverileri düzenlemenin yaygın yollarını destekleyen şablon sınıfları. list

    • Algoritmalar: İşlevsel, algoritma ve sayısal gibi nesne dizilerinde ortak işlemler gerçekleştirmeye yönelik şablon işlevleri.

    • Yineleyiciler: Yardımcı program, yineleyici ve bellek gibi algoritmaları ve kapsayıcıları birbirine yapıştıran tutkal.

  2. Giriş/Çıkış, ileriye doğru bildirimleri (iosfwd), önceden tanımlanmış iostreams nesneler (), temel iostreams sınıflar iostreams (iosiostream), akış arabelleği oluşturma (streambuf), akış biçimlendirmesi ve manipülatörleri (iosmanip, , ostreamistream), dize akışları (sstream) ve dosya akışları (fstream) bileşenlerini içerir.

  3. Diğer Standart C++ üst bilgileri şunlardır:

    • Dil Desteği: Kitaplık (cstddef), önceden tanımlanmış türlerin özellikleri (limits, cfloat, climits), C++ programının başlatılmasını ve sonlandırılmasına yönelik işlevlerin özellikleri ( ), dinamik bellek yönetimi desteği (cstdlib), dinamik tür tanımlama desteği (typeinfonew), özel durum işleme desteği (exception) ve diğer çalışma zamanı desteği (cstdarg, ctime, , csetlmpcsignal) için bileşenler.

    • Tanılama: Çeşitli istisnai koşulları (), belgeleme programı onaylarını (stdexceptcassert) ve hata numarası kodlarıcerrno () için genel değişkeni raporlamaya yönelik bileşenler.

    • Dizeler: Dize sınıfları (string) ve null ile sonlandırılan sıra yardımcı programları (cctype, cwctype, cwchar) için bileşenler.

    • Yerelleştirme: C++ programlarının kültürel farklılıkları kapsüllemek için kullanabileceği bileşenler. Yerel ayar özelliği karakter sınıflandırması ve dize harmanlaması, sayısal, parasal ve tarih/saat biçimlendirmesi ile ayrıştırma ve ileti alma (locale, clocale) için uluslararasılaştırma desteğini içerir.

CRT ile Standart C++ kitaplığı arasındaki fark nedir? Çalışma zamanı kitaplığı derleyici seçenekleri hangi kitaplıkları içerecek?

Visual C++, Microsoft Foundation Sınıfları (MFC) kitaplıklarının yanı sıra aşağıdaki kitaplıkları içerir:

  • Temel C-Runtime kitaplığı
  • Standart C++ kitaplığı
Kitaplık türleri ve ilgili derleyici anahtarları Temel C Çalışma Zamanı kitaplığı / Standart C++ kitaplığı
Tek iş parçacıklı (/ML) LİBC. LIB / LIBCP. LİB
Tek iş parçacıklı (/MLd) hata ayıklama LIBCD. LIB / LIBCPD. LİB
Çok iş parçacıklı (/MT) LIBCMT. LIB / LIBCPMT. LİB
Çok İş Parçacıklı (/MTd) Hata Ayıklama LIBCMTD. LIB / LIBCPMTD. LİB
Çok İş Parçacıklı DLL (/MD) MSVCRT. LIB / MSVCPRT. LİB
Çok İş Parçacıklı /DLL Hatalarını Ayıklama (MDd) MSVCRTD. LIB / MSVCPRTD. LİB

Not

  • Visual C++'da statik olarak tek iş parçacıklı kitaplıklar için /ML ve /MLd kitaplık derleyici seçenekleri kaldırıldı.
  • MSVCPRT.lib ve MSVCPRTD.lib statik kitaplıklardır ve bunlarla doğrudan ilişkili dinamik bağlantı kitaplıkları (DLL' ler) yoktur. Bu kitaplıklar sırasıyla MSVCRT.lib ve MSVCRTD.lib'ye de bağımlıdır. MSVCPRT.lib veya MSVCPRTD.lib kullanan uygulamalarınız varsa ve Varsayılan Kitaplığı Yoksay (/NOD veya NODEFAULTLIB) seçeneğini kullanıyorsanız, MSVCPRT.lib (veya MSVCPRTD.lib) ve MSVCRT.lib (veya MSVCRTD.lib) uygulamalarını uygulamanıza bağladığınızdan emin olun. Aksi takdirde, uygulamanızı bağlarken bağlayıcı hataları (LNK2001: MSVCPRT.lib veya MSVCPRTD.lib içinde çözümlenmemiş dışlar) alırsınız. Kodunuzda kullandığınız üst bilgilere bağlı olarak, Standart C++ kitaplığından bir kitaplık da bağlanabilir.

use_ansi.h üst bilgi dosyası, Standart C++ kitaplığını bağlanmaya zorlayan deyimler içerir#pragma. Tüm Standart C++ üst bilgileri use_ansi.h içerir: Uygulamanıza herhangi bir Standart C++ üst bilgisi eklerseniz, Standart C++ kitaplığı varsayılan olarak bağlanır.

Standart C++ üst bilgileri

Sütun 1 Sütun 2 Sütun 3 Sütun 4
ALGORİTMASI BİTSET KARMAŞIK DEQUE
ÖZEL DURUM FSTREAM IŞLEVSEL IOMANIP
IOS IOSFWD IOSTREAM ISTREAM
YİNELEYİCİ SINIR -LARI LİSTE YEREL AYAR
HARİTA BELLEK SAYISAL OSTREAM
SIRA AYARLAMAK SSTREAM YIĞIN
STDEXCEPT STREAMBUF DİZE STRSTREAM
TYPEINFO YARDIMCI PROGRAMI VALARRAY VEKTÖR

Projemi önceki bir sürümden taşımam durumunda Visual C++ .NET 2003 veya önceki sürümlerden eski 'iostream' işlevselliğini koruma

Eski iostream kitaplığı (iostream.h) korumak istiyorsanız, kodunuza eski iostream üst bilgi dosyalarından birini veya daha fazlasını ekleyin. Yeni Standart C++ üst bilgilerini kullanmayın. Eski iostream kitaplığa ve yeni Standart C++ kitaplığına yapılan çağrıları karıştıramazsınız.

Standart C++ Kitaplıklarını uygulamam için varsayılan kitaplıklar yapma

Standart C++ Kitaplıklarını varsayılan yapmak istiyorsanız, yeni Standart C++ üst bilgilerinden birini veya daha fazlasını ekleyin. Eski iostream ve yeni Standart C++ kitaplığına yapılan çağrıları karıştıramazsınız. Eski iostream işlevleri kullanan mevcut kitaplıkların (statik veya dinamik bağlantı) Standart C++ kitaplık iostream işlevlerini kullanacak şekilde değiştirilmesi gerekir.

MFC uygulamalarında Standart C++ Kitaplıkları kullanırsam, C-Runtime Kitaplıklarıyla çakışmalara neden olur

Hayır. Microsoft Foundation Sınıfları (MFC), Standart C++ Kitaplıklarıyla çakışacak C-Runtime işlevlerini kullanmaz.

'iostream' eklemiş olmama rağmen neden hata alıyorum (hata C2065: ''cout'' : bildirilmemiş tanımlayıcı)

Standart C++ kitaplığı kendi ad alanında stduygulanır. Programınızın başına aşağıdaki deyimi eklediğinizden emin olun:

using namespace std;

Veya her Standart C++ kitaplık tanımlayıcısını ad alanıyla stdniteleyin; örneğin, std::cout.

Neden hata alıyorum (derleyici hatası C2371: 'identifier' yeniden tanımlama; farklı temel türler)

Visual C++ 2005'ten önceki Visual C++ sürümlerinde, standart C++ üst bilgileriyle eski iostream üst bilgileri karıştırmak, farklı kaynak dosyalara eklenmiş olsalar bile bu hataya neden olur. Farklı üst bilgiler şunlardır:

  • Eski iostream üst bilgiler:

    Sütun 1 Sütun 2
    FSTREAM. H IOMANIP. H
    IOS. H IOSTREAM. H
    ISTREAM. H OSTREAM. H
    STDIOSTR. H STREAMB. H
    STRSTREA. H
  • Standart C++ üst bilgileri:

    Sütun 1 Sütun 2 Sütun 3 Sütun 4
    ALGORİTMASI BİTSET KARMAŞIK DEQUE
    ÖZEL DURUM FSTREAM IŞLEVSEL IOMANIP
    IOS IOSFWD IOSTREAM ISTREAM
    YİNELEYİCİ SINIR -LARI LİSTE YEREL AYAR
    HARİTA BELLEK SAYISAL OSTREAM
    SIRA AYARLAMAK SSTREAM YIĞIN
    STDEXCEPT STREAMBUF DİZE STRSTREAM
    TYPEINFO YARDIMCI PROGRAMI VALARRAY VEKTÖR

Proje Varsayılan Kitaplıkları Yoksay ile oluşturulduğunda neden ileti alıyorum (LNK2001: 'iostream' işlevinde çözümlenmemiş dış simge 'symbol';) çağrıları

iostream İşlevler C-Runtime kitaplığından kaldırılmıştır.

Eski iostream işlevleri kullanıyorsanız, başka bir KITAPLıK LIBCI.lib (tek iş parçacıklı ML), LIBCIMT.lib (çok iş parçacıklı MT) veya MSVCIRT.lib (çok iş parçacıklı dll MD) eklemeniz gerekir. Bu kitaplıklar Visual C++ uygulamasından kaldırılmıştır.

Standart C++ kitaplığına eklenen yeni iostream işlevleri kullanıyorsanız, başka bir KITAPLıK LIBCP.lib (tek iş parçacıklı ML), LIBCPMT.lib (çok iş parçacıklı MT) veya MSVCPRT.lib (çok iş parçacıklı dll MD) eklemeniz gerekir.

Kitaplıkların farklı sürümlerini karıştırmayın. Örneğin, C-Runtime kitaplığının tek iş parçacıklı sürümünü kullanıyorsanız, eski iostream kitaplığın veya Standart C++ kitaplığının tek iş parçacıklı sürümünü de kullanmanız gerekir.

Eski iostream kitaplık işlevlerine ve yeni Standart C++ kitaplık iostream işlevlerine çağrıları karıştıramazsınız.

Neden C4786 veya C4788 derleyici uyarıları alıyorum? Programımdaki simgelerin hiçbiri 255 karakter uzunluğunda değil

Bir simgenin adı 255 karakteri aştığında C4786 veya C4788 verilir. Bu sorun genellikle şablon sınıfında ortaya çıkar ve STL şablon sınıfını kapsamlı bir şekilde kullanır.

Bu uyarıyı yoksaymak güvenlidir. İletileri engellemek için bir #pragma uyarı kullanın (devre dışı bırakın: 4786,4788).

neden ileti alıyorum (C4530: C++ özel durum işleyicisi kullanılıyor, ancak geri sarma semantiği etkin değil. -GX belirtin)

Standart C++ kitaplığını kullanan programlar, C++ özel durum işlemesi etkin olarak derlenmelidir. C++ özel durum işlemesi aşağıdaki yöntemlerden biri tarafından etkinleştirilebilir:

  • Proje Ayarları iletişim kutusundaki C/C++ sekmesinin C++ Dil Kategorisi'ndeÖzel durum işlemeyi etkinleştir seçeneğini belirleme.
  • /GX derleyici anahtarını kullanma.

Neden derleyici hatası C2146, ardından C2065 ve son olarak da C2143 alıyorum, hepsi kaynağımda aynı satıra işaret ediyor

Bu hata dizisi aşağıdaki yapı türünden kaynaklanabilir:

vector<int, allocator<int>>iV;

Sorun, bildirimin sonundaki ardışık >> sorundan kaynaklanır. Çözüm, iki karakter arasına boşluk koymaktır, böylece yapı şu hale gelir:

vector<int, allocator<int> > iV;

Önerilen ANSII belirtimi ile tutarlıdır.