2012-03-27 12 views
6

Ben Android'e Windows kütüphane taşıma am (GNU Standart C++ Kitaplığı seçeneği, libstdC++ - v3) ve örneğin VC ve GNU kütüphaneleri arasında sayısız adlandırma farklılıkları, orada görünmek:Standart kütüphane işlev adları neden Windows ve Linux arasında farklıdır?

  • _stricmpstrcasecmp denir yerine
  • _unlink denir unlink
  • _scalb denir scalbn
  • _finite denir isfinite
  • _isnan mevcut mu GNU C++ içinde
  • atoi mevcut görünmüyor isnan
  • _itoa ve itoa denir, ama atoi64

VC ve GNU kütüphanelerine hem dokümantasyonu onlar "ISO uygulamak anlamına gelir "C++, örneğin, bu gibi" ISO C++ "adlarını kullanmamak için VC2008'den birkaç uyarı alabilirsiniz:" Uyarı C4996: 'itoa': Bu öğenin POSIX adı kullanımdan kaldırılmıştır. Bunun yerine, ISO C++ uyumlu ad: _itoa. "Benzer şekilde GNU'nun el kitabında" GNU Standart C++ Kütüphanesi v3, ISO 14882 Standard C++ kütüphanesinin uygulanmasına yönelik devam eden bir projedir "diyor.

Kütüphaneler bunlarla nasıl sonuçlanır? ? farklı isimler daha "standart" olan isimler Ayrıca

söyleyebilir nasıl orada bir endeksi sayede libstdC++? - her yerde v3, yani kütüphanedeki tüm işlevlerin basit bir listeden sadece bir manual bulabilirsiniz ve "source documentation" işlevlerinin bir listesini sunmuyor gibi görünüyor.

+8

Bunların bir kısmı C++ standart kitaplığında bulunmaz, bu nedenle bu tür durumlarda "standart" yoktur. –

+2

Microsoft, standart dışı işlevlerini önde gelen bir altçizgiyle isimlendirerek tutarlı olmaya çalışıyor. MSVC'de –

+1

'_atoi64', GCC’de' atoll' olarak adlandırılır. – dan04

cevap

12

C++ ile çok az ilgisi var standart kütüphane. C99 ve POSIX ile daha fazla ilgisi var.

  • strcasecmp, libstdC++ uygulamasının gerçekleştirdiği bir POSIX işlevidir. msvcrt tipik olarak POSIX'den kol uzunluğunda kalır.
  • unlink benzerdir — bir POSIX işlevidir. C99 standardındaki işlevin adı
  • scalbn'dur. MSVC, C99'u desteklemiyor. Ancak, scalbn, C++ 11'in bir parçası olduğundan, sonunda msvcrt içinde görünmesini beklerim.
  • isfinite ve isnan her ikisi de C99'dur.
  • itoa ne C99 ne de POSIX'dir. Bu gece ortaya çıkan tuhaf bir canavar.

Ayrıca, diğerlerinin neler gösterdiğini de belirteceğim: standart kitaplıktaki standart olmayan bir altçizgi öneklemek için teknik olarak daha doğrudur. Bu, msvcrt'ta alt çizgiların çoğalmasının nedeni.

+0

Yani bir alt çizgi "derleyici özel" gösterir. Teşekkürler, sadece bir şey daha var: bu şeyleri zaman içinde öğrendiniz mi, yoksa herhangi bir işlevin C++ 11, C++, yeni mi, yoksa yeni bir şey mi olduğunu öğrenmek için kolay bir yol var mı? Aynı anda hem POSIX hem de C/C++ standartlarında fonksiyon var mı? – Qwertie

+0

Ve sanırım MSVC tarafından uygulanan tüm POSIX yöntemleri bir alt çizgilere sahipken, GNU tarafından uygulanan tüm POSIX yöntemlerinde alt çizgi yoktur. Benim kod kullanmak için ortak bir isim tanımlamak gerekecek, bu yüzden, ortak adında bir alt çizgi kullanmak daha iyi olacağını düşünüyorsunuz ("#ifdef LINUX int _unlink (const char * p) {...}") veya değil ("#ifdef WIN32 int unlink (const char * p) {...}")? – Qwertie

+0

Oh, ve - Üzgünüm, daha fazla soruları düşünmeye devam ediyorum - hem Windows hem de Linux'ta kullanabileceğiniz alternatif isimler var mı? Örneğin, POSIX unlink() veya C99 scalbn() yerine, bir dosyayı silmek veya bir kayan nokta sayısında üslere bir şey eklemek için bir ISO standardı C++ işlevi var mı? Veya gerçekten taşınabilir C++ kodu yazmanın bir yolu yok mu? – Qwertie

1

O tanımlayıcılar standardına göre uygulanmasına ayrılacaktır için garantili olduğundan herhangi uygulanması, onlar görev adlarına _ prepend eğer bunların uygulanması "ISO standardı" dediğimiz ve onlar istediğimizi yapabiliriz sanırım. Ama aynı zamanda da taşınabilir olmaları garanti edilmez.

2

Bunların hiçbiri standart değildir. Standart, isimleri eklememeniz gerektiğini söylüyor, ancak uyarıların gerçekte ne anlama geldiğidir. Alt çizgi standartlara uygun hale gelir çünkü standart C/C++'da bir şey olarak karıştırılmayacaktır.

Altyazı ekleyerek, kodunuzun standartta bir şey kullanacağını ancak sürümlerin hiçbirini kullanmadığını ima ederler.

İlgili konular