C ++ 20: Büyük Üç Compars Formunun Desteği
Modüller, C ++ 20'deki dört büyük yenilikten biridir. C ++ sınıflarım 20'de ana konulardan birisiniz. Ne yazık ki, GCC ve Clang'daki uygulama Microsoft Derleyicisinin çok gerisindeydi. Bu yüzden esas olarak modülleri sunmak için sınıflarımda, derslerim ve kitaplarımda Microsoft derleyicisini kullandım. GCC ve CLANG modülünün desteğinin gelişmesinden memnunum. Bu nedenle, bu makalede, büyük üç GCC, CLANG ve MSVC derleyicilerinin formunun (10/2023) uygulanmasının mevcut durumunu sunacağım.
Rainer Grimm yıllardır yazılım mimarı, ekip ve eğitim müdürü olarak çalıştı. C ++ programlama dilleri, Python ve Haskell hakkında makaleler yazmayı seviyor, ancak uzman konferanslarla konuşmayı da seviyor. Modern C ++ blogunda, C ++ tutkusuyla yoğun bir şekilde ilgileniyor.
Son dört yılda C ++ 20 hakkında neredeyse 100 makale yazdım, ancak henüz bitirmedim. Bir sonraki makalemde C ++ 20'deki hikayeme devam edeceğim.
C ++ 20'deki modüllere aşina değilseniz, burada basit bir örnek bulacaksınız:
Basit bir modül
Bu form math.
// math1.ixx
module; // (1)
#include <numeric>
#include <vector>
export module math; // (2)
export int add(int fir, int sec){
return fir + sec;
}
export int getProduct(const std::vector<int>& vec) {
return std::accumulate(vec.begin(), vec.end(), 1, std::multiplies<int>());
}
Global modülün parçası anahtar kelime ile başlar module (1) ve ihracat formunun beyanıyla sona erer (3). Global modülün parçası, işlem öncesi işlem öncesi talimatların #include Formun tamamlanabilmesi için kullanılabilir. Küresel modüler fragman içinde kullanılan işlemcinin varlıkları sadece formda görülebilir. Modül math İki işlevi dışa aktarın add VE getProduct.
İstemci formu içe aktarır math (1) ve işlevlerini kullanır:
// client1.cpp
#include <iostream>
#include <vector>
import math; // (1)
int main() {
std::cout << 'n';
std::cout << "add(2000, 20): " << add(2000, 20) << 'n';
std::vector<int> myVec{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::cout << "getProduct(myVec): " << getProduct(myVec) << 'n';
std::cout << 'n';
}
Bu programın baskısı:
Modüller hakkında daha fazla bilgi aşağıdaki makalelerde mevcuttur:
C ++ 20 ile tanıtılan kavramlar, modern C ++ uygulamalarının oluşturulmasını kütüphane, modüller ve aralıkların aralıkları ile yeniden tanımladı. 7-9 Kasım 2023 arasında Rainer Grimm, yoğun C ++ 20 seminerinde kalmanızı sağlar: Yeni kavramlar, C ++ 20'nin sahip olduğu birçok yararlı işlevi geniş bir şekilde açıkladı ve yanıtladı.
Üç büyük modülün desteği
math.ixx Modülü tanımlar mathAşağıdaki karşılaştırmada kullanacağım.
// math.ixx
export module math; // (1)
export int add(int fir, int sec){
return fir + sec;
}
Ayrıca, müşteri programı burada client.cppbu form math ithal.
// client.cpp
import math; // (2)
int main() {
add(2000, 20);
}
(1) İhracat formunun beyanıdır ve (2) Form önemlidir. Açık nedenlerle programın baskısını görmezden geleceğim.
Çünkü form açıklama dosyası math.ixx Bahsedilen başlangıçta tahriş olabilir.
Modülasyon Dosyaları Dosyaları
Formu doldurun ve kullanın
İlk olarak X64 derleyicisi için Microsoft'un CL.EXE 19.29.30133 ile başlıyorum.
Bunlar formu Microsoft derleyicisiyle doldurma ve kullanma adımlarıdır. Yalnızca minimum komut satırını gösteriyorum. Söz verdiği gibi, bir sonraki makaleye daha fazla yazacağım. Bayrak yerine eski bir Microsoft derleyicisi ile /std:c++20 Bayrak /std:c++latest kullanılabilir.
cl.exe /std:c++20 /c math.ixx
cl.exe /std:c++20 client.cpp math.obj
Klan derleyicisine devam edin.
Klan derleyicisini 16.0.5 kullanıyorum.
Clang derleyicisi genişleme ile bir form bekliyor cppm. Bu yüzden dosya olacağım math.ixx İçinde math.cppm yeniden isimlendirmek. Dosya client.cpp Öte yandan, değişmeden devam edilebilir. Son olarak, formun oluşturulması ve kullanımı için ilgili adımlar şunlardır:
clang++ -std=c++20 -c math.cppm --precompile -o math.pcm
clang++ -std=c++20 client.cpp -fprebuilt-module-path=. math.pcm -o client.exe
Sonunda GCC derleyicisini kullanıyorum.
GCC derleyicisi 11.1.0 artık kullanılmaktadır.
GCC derleyicisi sonek beklemiyor ixx Windows'tan sonek cppm Clang'dan. Bu yüzden dosyayı adlandırıyorum math.ixx Bir CPP dosyasına: math.cxx. Dosya client.cpp Microsoft ve Clan Derleyicisi ile ne kullandığımla aynı.
g++ -c -std=c++20 -fmodules-ts math.cxx
g++ -std=c++20 -fmodules-ts client.cpp math.o -o client
Bu makalede size üç büyük modül oluşturabileceğiniz ilk adımları gösterdim. Bir sonraki makalemde, üç büyük modülün desteğini derinleştireceğim.
(RME)
C ++ 20: Büyük Üç Compars Formunun Desteği
Modüller, C ++ 20'deki dört büyük yenilikten biridir. C ++ sınıflarım 20'de ana konulardan birisiniz. Ne yazık ki, GCC ve Clang'daki uygulama Microsoft Derleyicisinin çok gerisindeydi. Bu yüzden esas olarak modülleri sunmak için sınıflarımda, derslerim ve kitaplarımda Microsoft derleyicisini kullandım. GCC ve CLANG modülünün desteğinin gelişmesinden memnunum. Bu nedenle, bu makalede, büyük üç GCC, CLANG ve MSVC derleyicilerinin formunun (10/2023) uygulanmasının mevcut durumunu sunacağım.

Rainer Grimm yıllardır yazılım mimarı, ekip ve eğitim müdürü olarak çalıştı. C ++ programlama dilleri, Python ve Haskell hakkında makaleler yazmayı seviyor, ancak uzman konferanslarla konuşmayı da seviyor. Modern C ++ blogunda, C ++ tutkusuyla yoğun bir şekilde ilgileniyor.
Son dört yılda C ++ 20 hakkında neredeyse 100 makale yazdım, ancak henüz bitirmedim. Bir sonraki makalemde C ++ 20'deki hikayeme devam edeceğim.

C ++ 20'deki modüllere aşina değilseniz, burada basit bir örnek bulacaksınız:
Basit bir modül
Bu form math.
// math1.ixx
module; // (1)
#include <numeric>
#include <vector>
export module math; // (2)
export int add(int fir, int sec){
return fir + sec;
}
export int getProduct(const std::vector<int>& vec) {
return std::accumulate(vec.begin(), vec.end(), 1, std::multiplies<int>());
}
Global modülün parçası anahtar kelime ile başlar module (1) ve ihracat formunun beyanıyla sona erer (3). Global modülün parçası, işlem öncesi işlem öncesi talimatların #include Formun tamamlanabilmesi için kullanılabilir. Küresel modüler fragman içinde kullanılan işlemcinin varlıkları sadece formda görülebilir. Modül math İki işlevi dışa aktarın add VE getProduct.
İstemci formu içe aktarır math (1) ve işlevlerini kullanır:
// client1.cpp
#include <iostream>
#include <vector>
import math; // (1)
int main() {
std::cout << 'n';
std::cout << "add(2000, 20): " << add(2000, 20) << 'n';
std::vector<int> myVec{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::cout << "getProduct(myVec): " << getProduct(myVec) << 'n';
std::cout << 'n';
}
Bu programın baskısı:

Modüller hakkında daha fazla bilgi aşağıdaki makalelerde mevcuttur:
- Modüllerin avantajları
- Basit bir matematik modülü
- Modül Arayüz Birimi ve Modüller Uygulama Birimleri
- Yapı modülleri
- Modüller hakkında daha açık sorular
- Özel Formlar Parçası ve Başlık Birimi

C ++ 20 ile tanıtılan kavramlar, modern C ++ uygulamalarının oluşturulmasını kütüphane, modüller ve aralıkların aralıkları ile yeniden tanımladı. 7-9 Kasım 2023 arasında Rainer Grimm, yoğun C ++ 20 seminerinde kalmanızı sağlar: Yeni kavramlar, C ++ 20'nin sahip olduğu birçok yararlı işlevi geniş bir şekilde açıkladı ve yanıtladı.
Üç büyük modülün desteği
math.ixx Modülü tanımlar mathAşağıdaki karşılaştırmada kullanacağım.
// math.ixx
export module math; // (1)
export int add(int fir, int sec){
return fir + sec;
}
Ayrıca, müşteri programı burada client.cppbu form math ithal.
// client.cpp
import math; // (2)
int main() {
add(2000, 20);
}
(1) İhracat formunun beyanıdır ve (2) Form önemlidir. Açık nedenlerle programın baskısını görmezden geleceğim.
Çünkü form açıklama dosyası math.ixx Bahsedilen başlangıçta tahriş olabilir.
Modülasyon Dosyaları Dosyaları
- Microsoft derleyicisi son eki kullanır ixx. Sonek ixx Bir form arabirimi dosyası anlamına gelir.
- Clang derleyicisi son eki kullanır cppm. . m Soneki muhtemelen form anlamına gelir.
- GCC derleyicisi özel bir genişleme kullanmaz.
Formu doldurun ve kullanın
İlk olarak X64 derleyicisi için Microsoft'un CL.EXE 19.29.30133 ile başlıyorum.

Bunlar formu Microsoft derleyicisiyle doldurma ve kullanma adımlarıdır. Yalnızca minimum komut satırını gösteriyorum. Söz verdiği gibi, bir sonraki makaleye daha fazla yazacağım. Bayrak yerine eski bir Microsoft derleyicisi ile /std:c++20 Bayrak /std:c++latest kullanılabilir.
cl.exe /std:c++20 /c math.ixx
cl.exe /std:c++20 client.cpp math.obj
- Riga 1 bir nesne dosyası oluşturur math.obj Ve bir IFC dosyası math.ifc. IFC dosyası modüldür ve form arayüzünün meta verilerinin açıklamasını içerir. IFC dosyasının ikili formatı Gabriel Dos Reis ve Bjarne Statetrup'un dahili programının temsilini takip eder.
- Riga 2 yürütülebilir dosyayı oluşturur client.exe. Derleyici dolaylı olarak derlenmiş olanı bulur math.ifc İlk adımdan gelen dosyalar.

Klan derleyicisine devam edin.

Klan derleyicisini 16.0.5 kullanıyorum.
Clang derleyicisi genişleme ile bir form bekliyor cppm. Bu yüzden dosya olacağım math.ixx İçinde math.cppm yeniden isimlendirmek. Dosya client.cpp Öte yandan, değişmeden devam edilebilir. Son olarak, formun oluşturulması ve kullanımı için ilgili adımlar şunlardır:
clang++ -std=c++20 -c math.cppm --precompile -o math.pcm
clang++ -std=c++20 client.cpp -fprebuilt-module-path=. math.pcm -o client.exe
- Riga 1 modülü oluşturur math.pcm. Son PCM, önceden doldurulmuş modüller içindir ve ifc-Microsoft Visual Derleyicilerin Malerung. Ek olarak, oluşturulan form zaten formun tanımını içerir. Sonuç olarak, Clang derleyicisi bir nesne dosyası oluşturmaz math.o. Opsiyon --precompile Pre -Concluse modülünün oluşturmak gerekir.
- Riga 2 yürütülebilir dosyayı oluşturur client.exemodül math.pcm kullanılmış. Klan derleyicisinin formun biçimine ihtiyacı vardır: -fprebuilt-module-path. Bu bilinmiyorsa, bağlantı süreci başarısız olur:

Sonunda GCC derleyicisini kullanıyorum.

GCC derleyicisi 11.1.0 artık kullanılmaktadır.
GCC derleyicisi sonek beklemiyor ixx Windows'tan sonek cppm Clang'dan. Bu yüzden dosyayı adlandırıyorum math.ixx Bir CPP dosyasına: math.cxx. Dosya client.cpp Microsoft ve Clan Derleyicisi ile ne kullandığımla aynı.
g++ -c -std=c++20 -fmodules-ts math.cxx
g++ -std=c++20 -fmodules-ts client.cpp math.o -o client
- Riga 1 modülü oluşturur math.gcm ve nesne dosyası math.o. Bunun için bayrak yapmalıyım -fmodules-ts belirtmek. Genleşme -fmodules-ts Beni rahatsız ediyorum çünkü ts Genellikle teknik özellikler içindir. Modül math.gcm alt dizinde yatıyor gcm.cache. math.gcm Derlenmiş formun arayüzüdür. Sonek gcm Muhtemelen GCC derlenmiş modüller içindir.
- Satır 2, yürütülebilir istemciyi oluşturur. Formu dolaylı olarak kullanın math.gcm.
Bu makalede size üç büyük modül oluşturabileceğiniz ilk adımları gösterdim. Bir sonraki makalemde, üç büyük modülün desteğini derinleştireceğim.
(RME)