Derlenmiş bir C ++ 11 kitaplığı (lib, dll, vb.) Eski C ++ derleyicilerine bağlanabilir mi?


12

Eski C ++ derleyicileri (örn. VS2008 ve gcc3.4) C ++ 11 ile yazılmış harici kütüphanelere bağlanabilir mi?

Benim düşüncem, bu aşamada C ++ 11 .lib dosyalarının sadece bayt kodu olduğu ve bir şekilde çözülebilir ve çağrılabilir olduğu sürece eski derleyicilerin nasıl oluşturulduğunu rahatsız etmemesi gerektiğidir.

API hala C ++ 03 kullanıcıları desteklemeli küçük bir kütüphane geliştiriyorum. Bu yüzden, ileriye baktığımda, std::unique_ptrve benzeri yararlı özellikleri kullanarak kütüphanemi uygulamanın uygun olup olmadığını merak ediyorum , yoksa sadece bağlı kalmam gerekiyor boost::mu?

Yanıtlar:


10

Kitaplığınızın uygulamasında yalnızca C ++ 11 kullanması ve C ++ 11 tesislerini veya türlerini genel olarak göstermemesi şartıyla ve özellikle statik bağlantı kullanıyorsanız, evet, bu mümkün ve hatta standarttır.

Bir kitaplığın C düzeyinde bir arabirimi (en geniş istemci çeşitliliği tarafından kullanılabilir olması) açığa çıkardığı, ancak C ++ içinde dahili olarak uygulandığı yaygın durumu düşünün. Böyle bir kütüphaneye bağlanan istemciler, yalnızca maksimum uyumluluk için eski C / C ++ olarak sınırlandırdığınız genel ikili API (dışa aktarılan işlevler) konusunda endişelenmelidir. Bir Java programı, dahili olarak C ++ ile uygulanan C düzeyi API'lere bağlanabilir. Bu, Java'nın "C ++ 'ı desteklemesi" gerektiği anlamına gelmez. Benzer şekilde, eski tip bir C / C ++ istemcisi, dahili olarak C ++ kütüphanelerinin veya diğer kütüphanelerin daha avant-garde sürümünü kullanan bir C düzeyi veya C ++ düzeyi API'sine bağlanabilir. İki ayrı şey vardır: kütüphanenin arayüzüne bağlanmak için gerekenler ve kütüphanenin dahili olarak neye bağlandığı (veya statik olarak çektiği).

Kitaplığınızın istemcilerini uygulamanızın bağımlılıklarına maruz bırakmazsınız.

Bağımlılıklarınızı (C ++ 11 veya başka bir şey) statik olarak kitaplığınıza bağlayabiliyorsanız, bu temiz ve bağımsızdır. Kütüphane gerçek bir kara kutudur: bayt kodundan başka bir şey değildir. Ancak kitaplığınız bağımlılıklarınıza "örtülü dinamik" bağlantı aracılığıyla bağlansa bile (LoadLibrary / GetProcAddress türünün açıklığı ve * nix ve OS X'teki benzer yöntemlerle karıştırılmamalıdır), eski istemciler yine de bu kitaplıklara bağlanabilmelidir. Genel arayüz, kütüphaneye bağlı kütüphanelere bağlanamasalar bile .


1
Harika! Tam da bunu umuyordum. C ++ 11'i kapsamlı bir şekilde kullanmayı düşünmüyorum, ancak uygun olduğunda gizli uygulamamda bir veya iki lambda işlevinde pop yapabileceğimi bilmek güzel. C ve Java analojileri anlamlıdır. Teşekkür ederim.
Konafa

4

Diğerlerinin kullanması için yeni bir kütüphane yazmak istediğiniz ve uygulama diliniz olarak C + 11'i kullanmak istediğiniz anlaşılıyor. Dikkate alınması gereken birkaç husus vardır:

  • C ++ 'ın yeni bir sürümünü tanıtarak, yeni C ++ çalışma zamanı kitaplıklarını kitaplığınızla birlikte dağıtma ihtiyacını ortaya koyacaksınız, tamam mı?
  • Eğer gereken değil aksi Adına ne derlerse mümkün olmayacaktır, genel arayüzde yeni C + 11 türlerini kullanmak.
  • Genel olarak, unique_ptr, even vector, vb. Gibi karmaşık türlerden kaçınmalısınız. Kitaplığınızı kaynak kodu olarak dağıtmadığınız sürece, kitaplığınızdaki nesnelerin düzeni istemci kodundaki mizanpajdan farklı olabilir. Nesne düzeni değişimleri riski olmayan basit türlere sadık kalın.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.