C ++ 20: Üç büyük derleyicinin formunun desteği hakkında daha fazla bilgi
Son makalem “C ++ 20: Büyük Üç Chorileer Modülünün Desteği”, üç büyük formla basit bir form derledim. Bugün dibe gidiyorum ve GCC, Clan ve Microsoft Derleyicisi kullanıyorum.
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.
Bu makale oldukça tekniktir ve ilginç bir gözlemle biter. Ayrıca, modüller hakkındaki önceki makalelerde bulunabilecek modüller hakkında temel bir bilgi gerektirir:
X64 için Microsoft'un CL.EXE 19.29.20133, CLANG 16.0.5 ve GCC derleyicisini 11.1.0 kullanıyorum.
Microsoft Visual Derleyici
Microsoft derleyicisiyle başlayalım.
Microsoft Visual Derleyici, modüllerin kullanımı için çeşitli seçenekler sunar:
Bazı generaller de var cl.exe Derleyici Seçenekleri:
Aşağıdaki satırlarda IFC dosyası için çeşitli derleyici seçenekleri kullanıyorum. IFC dosyası modüldür ve form arayüzünün meta verilerinin açıklamasını içerir.
cl.exe /c /std:c++latest /interface /TP math.cppm
cl.exe /c /std:c++latest /ifcOnly /interface /TP math.cppm
cl.exe /c /std:c++latest /interface /TP math.cppm /ifcOutput mathematic.ifc
cl.exe /std:c++latest client.cpp math.obj /reference math.inter
cl.exe /std:c++latest client.cpp math.obj /ifcSearchDir ifcFiles /reference math.inter
Klan derleyicisi artık kullanılıyor.
Klan derleyicisi
Klan derleyicisi modüller oluşturmak için çeşitli seçenekler sunar:
Daha fazla ayrıntı C ++ standart modülündeki resmi belgeselde mevcuttur. Aşağıdaki satırlarda Form ve IFC dosyası için derleyici seçeneklerini kullanıyorum.
clang++ -c -std=c++20 -fmodule-output math.cppm -o math.pcm
IXX genişlemesi ile formu kullanın (math.ixx) PCM dosyasına math.pcm Oluşturmak için.
clang++ -std=c++20 --precompile -x c++-module math.ixx -o math.pcm
PCM dosyasını oluşturun ve kullanın.
clang++ -std=c++20 -c math.pcm -o math.o
clang++ -std=c++20 -fprebuilt-module-path=. math.o client.cpp -o client.exe
PCM dosyasını kullanın other.pcm Ve onları derleyin.
clang++ -std=c++20 -c client.cpp -fmodule-file=math=other.pcm -o client.o
Derleyici GCC'ye gidiyorum.
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ı.
GCC derleyicisi
Aşağıdaki tabloda birkaç GCC seçeneği gösterilmektedir:
Adreslerin üç büyük biriminin birçok seçeneği.
Başlık birimleri, başlık dosyalarının ikili bir temsilidir ve başlıktan modüllere geçişi temsil eder. Yapmalısın #include-yeni yolla yürütme ImportTalimatları ve bir noktayı ve virgülleri değiştirin (
eklemek.
#include <vector> => import <vector>;
#include "myHeader.h" => import "myHeader.h";
Başlık birimleri hakkında daha fazla bilgi, önceki “Özel Modüller ve Başlık Birimleri Parçası” makalemde mevcuttur. Başlık birimleri ile aşağıdaki satırlarda ve aşağıdaki dosyaları kullanın:
// head.h
#include <iostream>
void hello();
// head.cpp
import "head.h";
void hello() {
std::cout << 'n';
std::cout << "Hello World: header unitsn";
std::cout << 'n';
}
// helloWorld3.cpp
import "head.h";
int main() {
hello();
}
Başlık dosyasından bir başlık birimi oldum head.h Microsoft Visual Derleyici için görsel derleyiciyi ve GCC derleyicisini oluşturun. C ++ Standart Resmi Dokümantasyon standardının aksine, klan derleyicisi ile başlık birimleri oluşturamadım.
cl.exe /std:c++latest /EHsc /exportHeader head.h
cl.exe /c /std:c++latest /EHsc /headerUnit head.h=head.h.ifc head.cpp
cl.exe /std:c++latest /EHsc /headerUnit head.h=head.h.ifc helloWorld3.cpp head.obj
g++ -fmodules-ts -fmodule-header head.h -std=c++20
g++ -fmodules-ts -c -std=c++20 head.cpp
g++ -fmodules-ts -std=c++20 head.o helloWorld3.cpp -o helloWorld3
Görünürlüğe Karşı Erişilebilirlik
Modüllerde, erişilebilirlik ve görünürlük arasında bir ayrım yapmak gerekir. Bir modül bir varlığı dışa aktarırsa, ithalatçı bir istemci onu görebilir ve kullanabilir. İhraç edilemeyen varlıklar görünür değildir, ancak erişilebilir olabilir.
// bar.cppm
module;
#include <iostream>
export module bar;
struct Foo {
void writeName() {
std::cout << "nFoon";
}
};
export struct Bar {
Foo getFoo() {
return Foo{};
}
};
Modül bar Sınıfı ihraç et Bar. Bar Görünür ve erişilebilir. Foo Öte yandan, görünür değildir.
// bar.cpp
#include <utility>
import bar;
int main() {
Bar b;
// Foo f; // (1)
auto f = b.getFoo();
f.writeName(); // (2)
using FooAlias =
decltype(std::declval<Bar>().getFoo()); // (3)
FooAlias f2; // (4)
f2.writeName(); // (5)
}
Sınıf Foo İhraç edilmez ve bu nedenle görünür değildir. (1) 'de kullanmak sol hataya neden olur. Aksine, Foo erişilebilir çünkü üyenin işlevi getFoo (İçinde bar.cppm) döndürür. Sonuç olarak, işlev writeName (2) Onlar çağrılır. Ayrıca veri türünün bir aka'sını da alabilirim Foo (3) oluşturun ve bunu için kullanın Foo (4) somutlaştırmak için e writeName (5). İfade std::declval<Bar>().getFoo() (3) Nesne bir aramaya döner Bar.getFoo() Geri dönecekti. Sonunda verir decltype Bu varsayımsal arka planın veri türü.
Sırada ne var?
Bir sonraki makalemde C ++ 20'deki Gamme Kütüphanesi'nde daha derin olacağım.
(RME)
C ++ 20: Üç büyük derleyicinin formunun desteği hakkında daha fazla bilgi
Son makalem “C ++ 20: Büyük Üç Chorileer Modülünün Desteği”, üç büyük formla basit bir form derledim. Bugün dibe gidiyorum ve GCC, Clan ve Microsoft Derleyicisi kullanıyorum.

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.

Bu makale oldukça tekniktir ve ilginç bir gözlemle biter. Ayrıca, modüller hakkındaki önceki makalelerde bulunabilecek modüller hakkında temel bir bilgi gerektirir:
- 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
X64 için Microsoft'un CL.EXE 19.29.20133, CLANG 16.0.5 ve GCC derleyicisini 11.1.0 kullanıyorum.
Microsoft Visual Derleyici
Microsoft derleyicisiyle başlayalım.
Microsoft Visual Derleyici, modüllerin kullanımı için çeşitli seçenekler sunar:

Bazı generaller de var cl.exe Derleyici Seçenekleri:

Aşağıdaki satırlarda IFC dosyası için çeşitli derleyici seçenekleri kullanıyorum. IFC dosyası modüldür ve form arayüzünün meta verilerinin açıklamasını içerir.
- Modülü kullanın math.cppmNesneyi ve IFC dosyasını oluşturmak için.
cl.exe /c /std:c++latest /interface /TP math.cppm
- Modülü kullanın math.cppmYalnızca IFC dosyasını oluşturmak için.
cl.exe /c /std:c++latest /ifcOnly /interface /TP math.cppm
- Modülü kullanın math.cppmNesne dosyasına math.obj Ve IFC dosyası mathematic.ifc Oluşturmak için.
cl.exe /c /std:c++latest /interface /TP math.cppm /ifcOutput mathematic.ifc
- Yürütülebilir dosyayı oluştur client.exe ve IFC dosyasını kullanın math.inter.
cl.exe /std:c++latest client.cpp math.obj /reference math.inter
- Yürütülebilir dosyayı oluştur client.exe ve IFC dosyasını açıkça kullanın math.interDizinde kim var ifcFiles yer.
cl.exe /std:c++latest client.cpp math.obj /ifcSearchDir ifcFiles /reference math.inter
Klan derleyicisi artık kullanılıyor.
Klan derleyicisi
Klan derleyicisi modüller oluşturmak için çeşitli seçenekler sunar:

Daha fazla ayrıntı C ++ standart modülündeki resmi belgeselde mevcuttur. Aşağıdaki satırlarda Form ve IFC dosyası için derleyici seçeneklerini kullanıyorum.
- Form Bildirimi dosyasını kullanın math.cppmPCM dosyasına math.pcm Oluşturmak için.
clang++ -c -std=c++20 -fmodule-output math.cppm -o math.pcm
IXX genişlemesi ile formu kullanın (math.ixx) PCM dosyasına math.pcm Oluşturmak için.
clang++ -std=c++20 --precompile -x c++-module math.ixx -o math.pcm
PCM dosyasını oluşturun ve kullanın.
clang++ -std=c++20 -c math.pcm -o math.o
clang++ -std=c++20 -fprebuilt-module-path=. math.o client.cpp -o client.exe
PCM dosyasını kullanın other.pcm Ve onları derleyin.
clang++ -std=c++20 -c client.cpp -fmodule-file=math=other.pcm -o client.o
Derleyici GCC'ye gidiyorum.

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ı.
GCC derleyicisi
Aşağıdaki tabloda birkaç GCC seçeneği gösterilmektedir:

Adreslerin üç büyük biriminin birçok seçeneği.
Başlık birimleri, başlık dosyalarının ikili bir temsilidir ve başlıktan modüllere geçişi temsil eder. Yapmalısın #include-yeni yolla yürütme ImportTalimatları ve bir noktayı ve virgülleri değiştirin (
#include <vector> => import <vector>;
#include "myHeader.h" => import "myHeader.h";
Başlık birimleri hakkında daha fazla bilgi, önceki “Özel Modüller ve Başlık Birimleri Parçası” makalemde mevcuttur. Başlık birimleri ile aşağıdaki satırlarda ve aşağıdaki dosyaları kullanın:
// head.h
#include <iostream>
void hello();
- Origin Dosyası head.cppBaşlık birimini ithal etti
// head.cpp
import "head.h";
void hello() {
std::cout << 'n';
std::cout << "Hello World: header unitsn";
std::cout << 'n';
}
- Ana program helloWorld3.cppBaşlık birimini ithal etti
// helloWorld3.cpp
import "head.h";
int main() {
hello();
}
Başlık dosyasından bir başlık birimi oldum head.h Microsoft Visual Derleyici için görsel derleyiciyi ve GCC derleyicisini oluşturun. C ++ Standart Resmi Dokümantasyon standardının aksine, klan derleyicisi ile başlık birimleri oluşturamadım.
- Microsoft Visual Derleyici
cl.exe /std:c++latest /EHsc /exportHeader head.h
cl.exe /c /std:c++latest /EHsc /headerUnit head.h=head.h.ifc head.cpp
cl.exe /std:c++latest /EHsc /headerUnit head.h=head.h.ifc helloWorld3.cpp head.obj
- Bayrak /exportHeader 1. satırda, IFC dosyasının head.h.ifc Başlık dosyasından head.h Yaratılmıştır.
- Uygulama dosyası head.cpp (Riga 2) ve istemci dosyası helloWordl3.cpp (Satır 3) Başlık birimini kullanın. Bayrak /headerUnit head.h=head.h.ifc Başlık birimini içe aktarın ve derleyiciye belirtilen başlık için IFC dosyasının adını söyleyin.
g++ -fmodules-ts -fmodule-header head.h -std=c++20
g++ -fmodules-ts -c -std=c++20 head.cpp
g++ -fmodules-ts -std=c++20 head.o helloWorld3.cpp -o helloWorld3
- (1) Formu oluşturun head.gcm. Bayrak -fmodule-header gösterir head.h Bir başlık oluşturulmalıdır.
- Aşağıdaki satır nesne dosyasını oluşturur head.o.
- Son olarak, yürütülebilir dosya, dolaylı olarak modül olan satır 3'te oluşturulur head.gcm kullanılmış.
Görünürlüğe Karşı Erişilebilirlik
Modüllerde, erişilebilirlik ve görünürlük arasında bir ayrım yapmak gerekir. Bir modül bir varlığı dışa aktarırsa, ithalatçı bir istemci onu görebilir ve kullanabilir. İhraç edilemeyen varlıklar görünür değildir, ancak erişilebilir olabilir.
// bar.cppm
module;
#include <iostream>
export module bar;
struct Foo {
void writeName() {
std::cout << "nFoon";
}
};
export struct Bar {
Foo getFoo() {
return Foo{};
}
};
Modül bar Sınıfı ihraç et Bar. Bar Görünür ve erişilebilir. Foo Öte yandan, görünür değildir.
// bar.cpp
#include <utility>
import bar;
int main() {
Bar b;
// Foo f; // (1)
auto f = b.getFoo();
f.writeName(); // (2)
using FooAlias =
decltype(std::declval<Bar>().getFoo()); // (3)
FooAlias f2; // (4)
f2.writeName(); // (5)
}
Sınıf Foo İhraç edilmez ve bu nedenle görünür değildir. (1) 'de kullanmak sol hataya neden olur. Aksine, Foo erişilebilir çünkü üyenin işlevi getFoo (İçinde bar.cppm) döndürür. Sonuç olarak, işlev writeName (2) Onlar çağrılır. Ayrıca veri türünün bir aka'sını da alabilirim Foo (3) oluşturun ve bunu için kullanın Foo (4) somutlaştırmak için e writeName (5). İfade std::declval<Bar>().getFoo() (3) Nesne bir aramaya döner Bar.getFoo() Geri dönecekti. Sonunda verir decltype Bu varsayımsal arka planın veri türü.

Sırada ne var?
Bir sonraki makalemde C ++ 20'deki Gamme Kütüphanesi'nde daha derin olacağım.
(RME)