GCC11.1对C++20支持基本完成,本文将使用GCC11.1构建g++11.1测试C++20 module特性。
GCC11.1 编译方法参看“【C++20】GCC11构建经验”,GCC11.1构建时间大概比GCC10.1长30分钟,达到1小时40分钟。
测试modules特性代码:https://zhuanlan.zhihu.com/p/350136757
测试代码1:
// A.cc
export module A;
export int foo();
// A.cpp
module;
#include <iostream>
module A;
int foo()
{
std::cout << 1 << std::endl;
return 1;
}
// main.cpp
import A;
int main()
{
foo();
}
$ g++11.1 -fmodules-ts -std=c++20 A.cc A.cpp main.cpp -o main
测试代码2:
// 1.cc
export module A; // 对外暴露一个叫 A 的 module
export import :Foo; // 对外暴露 A:Foo 这个模块
export int baz(); // 对外暴露 int baz();
// 2.cc
export module A:Foo; // 对外暴露 A:Foo 这个模块
import :Internals; // 引入 A:Internals 这个模块
// 给出函数 int foo() 的实现, 并且对外暴露
export int foo() { return 2 * (bar() + 1); }
// 3.cc
module A:Internals; // 表明我就是 A:Internals 这个模块
int bar(); // 表明本模块里面有一个 int bar() 函数.
// 4.cc
module; // 表明现在我是 global module fragment
#include <iostream>
module A; // 表明现在我是模块 A 的 module implementation unit
import :Internals; // 引入 A:Internals 这个模块
// 给出了 A:Internals 之中 int bar() 的定义 (具有 module linkage)
int bar() { return baz() - 10; }
// 给出了 1.cc 中 int baz() 的定义 (具有 external linkage)
int baz()
{
std::cout << 30;
return 30;
}
// main.cpp
import A;
int main(){
foo();
}
$ g++11.1 -fmodules-ts -std=c++20 3.cpp 2.cpp 1.cpp 4.cpp main.cpp -o main