C ++ Modülleri - C ++ 0x'ten neden kaldırıldılar? Daha sonra geri gelecekler mi?


110

C ++ 0x'deki modüller hakkındaki bu eski C ++ 0x taslağını yeni keşfettim .

Buradaki fikir, sadece .cpp dosyalarını yazarak mevcut .h / .cpp sisteminden çıkmaktı, bu dosyalar daha sonra derleme sırasında modül dosyaları oluşturacak ve daha sonra diğer .cpp dosyaları tarafından kullanılacaktı.

Bu gerçekten harika bir özelliğe benziyor.

Ama sorum şu: neden onu C ++ 0x'den kaldırdılar? Çok fazla teknik zorluk yüzünden miydi? Zaman eksikliği? Ve sizce daha ileri bir C ++ sürümü için üzerinde çalışmayı düşünecekler mi?

Yanıtlar:


70

Gönderen C ++ Evolution (2008 Mesaj San Francisco) Eyaleti , Modüller önerisi olarak kategorize edildi "ayrı TR için başlığı'den:"

Bu konular, yayınlanmadan önce C ++ 0x'in ardından başka bir standardı beklemek için çok önemli, ancak bir sonraki Standart için zamanında sonuçlandırılamayacak kadar deneysel olarak kabul edilir. Bu nedenle, bu özellikler en erken fırsatta teknik bir raporla teslim edilecektir.

Modül önerisi henüz hazır değildi ve beklemek C ++ 0x standardını bitirmeyi geciktirecekti. Gerçekten kaldırılmadı, sadece çalışma kağıdına dahil edilmedi.


89

C ++ Modülleri taslağı (C ++ 17'den sonra Teknik Özellikler)

C taslağı ve çok sayıda güncellenmiş revizyonları / C ++ modülü şartname tarafından yayınlanmıştır WG21 open-std.org üzerinde. Burada yalnızca en son belgelere bağlantı vereceğim:

  • Çalışma Taslağı, N4610 Modülleri için C ++ Uzantıları (Ekim 2016).
  • Dördüncü revizyon P0142R0 (Mart 2016) olarak yayınlandı .
  • P0143R2 (Mart 2016) olarak yayınlanan Modüller için İfadeler .
  • Clang ekibi, değişikliklerinin ikinci bir revizyonunu yayınladı: P0273R1 (Ekim 2016).

Aşağıdaki blog yazıları, standart toplantılarının bir özetini ve özellikle modül taslağının mevcut durumunun bir özetini içerir:

Güncelleme: Yukarıda bağlantı verdiğim Kona gezi raporunda açıklandığı gibi, şu anda biri Microsoft ve biri Clang'dan olmak üzere iki rakip teklif var. Microsoft'tan önerilen çözüm, Makroların dışa aktarılmasına izin vermezken, Clang ekibinin çözümü, Makroların dışa aktarılmasını destekleyecektir. Şimdiye kadar yalnızca Microsoft, bir modül spesifikasyonu için resmi olarak bir taslak sunmuştur.

Microsoft tarafından önerilen modül özellikleri

İşte bu teklifin içerdiği en önemli kavramlara hızlı bir genel bakış. Taslak olduğu için bu muhtemelen değişebilir. Yeni modül standardı diğer şeylerin yanı sıra aşağıdakilerden oluşacaktır:

Bir modulemodülü bildirmek için bir anahtar sözcük, birden çok dosya bunu bir modül oluşturmak için bildirebilir (ancak her modül için yalnızca bir derleme birimi bir export {}bölüm içerebilir ):

module M;

importModülleri içe aktaracak bir anahtar sözcük yerine bunun yerine importkullanılmasına da karar verilebilir using module, böylece yeni bir içe aktar anahtar sözcüğünden kaçınılabilir.

import std.io;
import module.submodule;

Bu modülün parçası olan exportgenel bildirimleri tanımlayan bir sözdizimi, modülün bir parçası olarak dışa aktarılmaması gereken arayüz dışı bildirimler , dışa aktarma bloğunun dışında tanımlanacaktır. Bildirimler , C / C ++ 'da herhangi bir bildirim türü olabilir, yani yalnızca işlevler değil, aynı zamanda değişkenler, yapılar, şablonlar, ad alanları ve sınıflar da olabilir:

export {
    int f(int);
    double g(double, int);

    int foo;

    namespace Calc {
         int add(int a, int b);
    }        
}

void not_exported_function(char* foo);

Modüllerde önemli bir değişiklik, makroların ve önişlemci tanımlarının modüllere yerel olması ve dışa aktarılmaması olacaktır. Dolayısıyla, makroların içe aktarılan modüller üzerinde herhangi bir etkisi yoktur:

#define FILE "my/file"
import std.io;   //will not be impacted by the above definition

Hem mevcut önişlemci sistemin hem de modüllerin bir arada var olabileceğine ve başlıkların örneğin makroları dahil etmek için hala kullanılabileceğine dikkat edin.

Daha detaylı bilgi için taslağı okumanızı öneririm.

Clang Modülleri

Clang, clang modülleri sayfasında bulunabilecek bir modül uygulaması üzerinde çalışıyor. . Ancak clang şu anda modüller için somut bir sözdizimi uygulamamaktadır, yani yukarıda bahsedilen sözdizimlerinin hiçbiri Clang tarafından uygulanmamıştır. Bunu açıklamak için sayfa aşağıdaki ifadeyi içerir:

Şu anda, ithalat bildirimleri için C veya C ++ sözdizimi yoktur. Clang, C ++ komitesindeki modül önerisini takip edecek. Modüllerin bugün nasıl içe aktarıldığını görmek için İçe aktarmalar olarak içerir bölümüne bakın.

Şu anda Clang tarafından uygulanan ana kısım, başlık dosyalarını kullanan mevcut kod için modül haritalarının yazılmasına izin veren "Modül Eşleme Dili" dir.

Modüllerden Makro Dışa Aktarma

Yukarıda belirtildiği gibi, makro ihracatın nihai Modül TS'nin bir parçası olup olmayacağı hala belirsizdir . In P0273R1 aşağıdaki sözdizimi makro ihracat için önerilmişti:

#export define MAX(A,B) ((A) > (B)) ? (A) : (B);

2
2018 Rapperswil'den güncelleme, Gabriel dos Reis ve Richard Smith, p1103r0'dan birleştirilmiş öneri var. botondballo.wordpress.com/2018/06/20/…
Dwayne Robinson

32

Clang, standardizasyon tamamlanmadan bile modüller üzerinde çalışmaya başlayan ilk derleyicidir. Henüz çok fazla belge yok, ancak örnek kod burada bulunabilir:
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/

Douglas Gregor'dan (bunları uygulayan geliştirici) bazı yorumlar:
http://clang-developers.42468.n3.nabble.com/C-modules-td3619936.html

Teorik olarak, kendinizi gelecekte söz diziminde meydana gelecek olası değişikliklerden korumak için begin_module, end_module, import_module gibi bir grup yardımcı makro tanımlayabilirsiniz.

DÜZENLEME 1:
Douglas Gregor uygulamasıyla ilgili bir sunum yayınladı:
http://llvm.org/devmtg/2012-11/Gregor-Modules.pdf?=submit

DÜZENLEME 2:
clang'daki modül desteği burada belgelenmiştir:
http://clang.llvm.org/docs/Modules.html

DÜZENLEME 3:
Modüller artık Microsoft'un C ++ derleyicisinde de desteklenmektedir: http://blogs.msdn.com/b/vcblog/archive/2015/12/03/c-modules-in-vs-2015-update-1. aspx


-39
  1. Çünkü çok büyük bir kavramsal değişim.
  2. Kaynakların h / cpp'ye ayrılması işi yaptığı için buna gerçek bir ihtiyaç yoktur.
  3. Çünkü C ++ gerçek "modüllerin" kitaplıklarının nasıl oluşturulacağını tanımlamaz. Derleyici geliştiricisine ve bağlayıcıya bırakır.
  4. "Modüller" bazen oldukça platforma bağlıdır, örneğin DLL'ler paylaşılan nesnelerden oldukça farklıdır. Dolayısıyla bu kavramları birleştirmek o kadar da önemsiz değil.

78
Kesinlikle bir ihtiyaç var. .h / .cpp gülünç derecede kötü ve modası geçmiş bir çözümdür. Bir modül sistemi büyük bir değişiklik olabilir, ancak bu, standart komitenin görünüşe göre önemli gördüğü bir sistemdir.
jalf

13
Üstbilgi oluşturma modeli, sorun modüllerinin çözüm değil çözmesi gereken şeydir. Ayrıca modüller DLL'lerin / SO'ların yerini almaz.
bames53

5
Bu yanlıştır: 1. Modül önerisi, mevcut başlık sistemiyle geriye dönük uyumluluk sağlamak için büyük özen gösterir, böylece modüller gelecekte tanıtıldığında hiçbir şey bozulmaz. 2. Başlık modülünün derleme zamanı karmaşıklığını O (M * N) karmaşıklığından O (M + N) ' ye düşürme ihtiyacı çok iyi belgelenmiştir. 3. Modül standardı, modüllerin nasıl derlendiğini ve bağlandığını belirlemez, ancak bir modülün özel ve genel API'si arasında ayrım yapmak için net bir anlam ekler. 4. DLL'lerin veya paylaşılan nesnelerin ikili biçimi standarttan etkilenmez.
lanoxx

3
"Kaynakların h / cpp'ye ayrılması işi yaptığı için buna gerçekten gerek yok", enjekte edilen bir parmağı zincirle kesmek de öyle ama bu bir sorun olmadığı anlamına gelmez! Sadece .NET'e veya daha yeni herhangi bir dile bakın, bir şeyleri sırf görünebilmesi veya doğru bir şekilde inşa edilebilmesi için belirli bir şekilde sipariş etmek zorunda kalmak, ortadan kalkması gereken büyük bir yüktür.
paulm
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.