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 module
modü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;
import
Modülleri içe aktaracak bir anahtar sözcük yerine bunun yerine import
kullanı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 export
genel 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);