我将从我自己的一个库中举一些例子,我已经转换为支持旧样式的标题和模块。
这个例子是一个只有头文件的库,我将添加一个只有当我有一个时才不是头文件的库的例子。
仅头文件/模块库
使导出成为可选。在我的情况下,我定义了一个带有宏的文件,如果项目与模块一起使用,则添加导出。
导出.h
#pragma once
// Macros for handling compatability with/without modules
#ifdef matmath_use_modules
#ifndef matmath_export
#define matmath_export export
#endif
#else
#ifndef matmath_export
#define matmath_export
#endif
#endif
然后几乎像往常一样定义库的标头,但稍作调整,使用导出宏而不是您想要的符号的导出关键字,并且所有包含都被删除。
vec.h
// vec.h
#pragma once
#include "export.h"
#ifndef matmath_use_modules
#include <cmath>
#include <ostream>
#if __cplusplus >= 201103L
#include <tuple>
#endif
#include "pi.h"
#endif
matmath_export template <typename T>
class VecT {
public:
T x = 0, y = 0, z = 0;
constexpr VecT() = default;
...
};
然后,您可以在选择的模块中使用您的标题并激活正确的宏。
向量.cppm
module;
#include <cmath>
#include <ostream>
import matmath.pi;
export module matmath.vec;
#define matmath_use_modules
#include "matmath/vec.h"
// If your file has a regular cpp-file you could include that
// here in the same fashion
// #include "path/to/vec.cpp"
最后:使用类时,您可以选择通过模块文件或头文件来使用项目(尽管将头文件和模块组合为 lib 会产生很多痛苦)。
使一个小项目可以使用和不使用模块来构建
如果你只是想构建一个有模块和没有模块的小项目,你可以删除所有导出相关的语句并将导入语句转换为包含。这种方法要求您对代码进行更改,或者至少有一个单独的步骤来创建没有模块相关代码的代码副本。https://github.com/mls-m5/rym/blob/master/non-module-build.sh