module是C++20种新引入的特性,关于module的介绍和好处,网上已有大量的文章,此处也不再赘述,本文仅记录在个人的环境上创建一个简单的module并使用这个module。
环境同上一篇文章( windows10,MSVC C++工具链,windows10 SDK)
module源文件:
//module_Vector.cpp
export module Vector;
export class Vector {
public:
Vector(int s);
double& operator[](int i) const;
int size() const;
private:
double* elem;
int sz;
};
Vector::Vector(int s):elem{new double[s]}, sz{s} {}
double& Vector::operator[](int i) const {
return elem[i];
}
int Vector::size() const {
return sz;
}
export bool operator==(const Vector& v1, const Vector& v2) {
if (v1.size() != v2.size())
return false;
for (int i = 0; i < v1.size(); ++i) {
if (v1[i] != v2[i])
return false;
}
return true;
}
命令行编译:
cl /std:c++latest /interface /c /EHsc /nologo /W4 /MTd module_Vector.cpp
/interface: 表明是编译module;
/c: 编译但不链接
编译后生成:module_Vector.obj;Vector.ifc
可见,module源文件的文件名无需和module保持一致;但生成的ifc文件名,会自动与module保持一致。
使用该module的文件:
//module01_user.cpp
import Vector;
#include <cmath>
#include <iostream>
double sqrt_sum(Vector& v) {
double sum = 0;
for (int i=0; i!=v.size(); ++i) {
sum += std::sqrt(v[i]);
}
return sum;
}
int main() {
Vector v {Vector(3)};
v[0] = 0.1;
v[1] = 0.2;
v[2] = 0.3;
std::cout << "sum is: " << sqrt_sum(v) << std::endl;
return 0;
}
命令行编译:
cl /std:c++latest /EHsc /nologo /W4 /MTd module01_user.cpp module_Vector.obj
需要指定上一步生成的obj文件;编译成功生成exe文件。
运行:
C:\c++_program>module01_user.exe
sum is: 1.31116