使用遗留头文件作为 c++20 模块

2024-03-28

我正在将旧代码转换为可作为 C++ 模块导入的代码。问题是我希望它仍然可以工作并且可以像旧的标头/源版本一样轻松维护。我该怎么做(如果可能的话)。

是否可以创建一个导出标头内容的模块? (也可以接受任何其他可以让您维护旧的 .cpp/.h 文件和模块文件的解决方案)

玩具示例:

// In vector.h
template <typename T>
struct Vector {
    T x, y;
}

// In .cppm
export module vector;
// #include "vector.h"
// Export struct/class Vector from header

我尝试过的只是export Vector不同版本,有或没有模板等。

额外问题:你能为 std 库做这个吗? (例如 iostream 或字符串)


我将举一些例子我自己的图书馆之一 https://github.com/mls-m5/matmath我已转换为支持旧样式标头和模块。

此示例适用于仅标头库,当我有一个库时,我将添加一个非标头库的示例。

仅标头/模块库

使导出成为可选。 就我而言,我已经定义了a file https://github.com/mls-m5/matmath/blob/master/include/matmath/export.h如果项目与模块一起使用,则使用添加导出的宏。

export.h https://github.com/mls-m5/matmath/blob/master/include/matmath/export.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

然后headers https://github.com/mls-m5/matmath/blob/master/include/matmath/vec.h库的定义几乎像往常一样,但进行了一些细微的调整,即使用导出宏而不是所需符号的导出关键字,并且所有包含都被删除。

vec.h https://github.com/mls-m5/matmath/blob/master/include/matmath/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;

   ...
};

然后,您可以在选择的模块中使用标头并激活正确的宏。

vec.cppm https://github.com/mls-m5/matmath/blob/master/modules/vec.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"

最后:在使用类时,您可以选择通过模块文件或头文件来使用项目(尽管将库的头文件和模块结合起来会带来很多麻烦)。

允许使用或不使用模块构建小型项目

如果您只想构建一个带有或不带有模块的小项目,您可以删除所有与导出相关的语句并将导入语句转换为包含。这种方法要求您对代码进行更改,或者至少有一个单独的步骤来创建代码的副本,而无需模块相关的代码。https://github.com/mls-m5/rym/blob/master/non-module-build.sh https://github.com/mls-m5/rym/blob/master/non-module-build.sh

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用遗留头文件作为 c++20 模块 的相关文章

  • C++ win32设置光标位置

    我知道要使用哪个功能 但我无法让它正常工作 我用了SetCursorPos 唯一的问题是它将光标设置为屏幕坐标而不是窗口坐标 我也尝试过ScreenToClient 但它并没有起作用 这是我的代码 pt x 113 pt y 280 Scr
  • 如何在C++、Qt、QML、Blackberry 10 Cascades Beta 3 SDK中制作图表/图形(如折线图、条形图、圆形图)等?

    我需要知道如何在 Blackberry 10 Cascades Beta 3 SDK QML Qt C 中制作图表 图表 如果有人可以向我展示一个例子或向我指出一些可以告诉我如何做到这一点的东西 我将不胜感激 您应该查看 QChart js
  • 为多线程 UDP 客户端执行“close ()”时套接字描述符未释放

    我在下面编写了 UDP 客户端 它基本上生成一个单独的线程来接收数据报 但是数据报仅在主线程中发送 现在 在 Linux 发行版上实例化 udpClient 1 UDP 客户端后按 ctrl D 实现退出循环 围绕 getline 调用 并
  • 在运行时配置 ASP.NET 会话状态

    我们有一个使用 SQL Server 会话状态的 ASP NET 网站 状态配置在Web config like
  • Windows Server / Datacenter:设置 CPU 关联性 > 64 个核心

    SetThreadAffinityMask 允许为 64 个逻辑核心 处理器 设置关联掩码 但是 Windows Datacenter 最多可以有 64 个 CPU 每个 CPU 都有多个内核 请参阅here http social tec
  • Qml 中的 FileDialog 在发布中不起作用

    我正在与以下项目合作Qt Quick Control 2 当我尝试在调试模式下运行软件时 FileDialog qml 可以完美打开 但是当我将其部署为发布模式时 它无法工作 这是我的代码 import QtQuick 2 4 import
  • 将 CryptoStream 解密为 MemoryStream

    我编写了一个过程 其中文件被加密并上传到 Azure 然后必须解密下载过程 这会失败并出现 填充无效且无法删除 错误 或 要解密的数据长度为无效的 错误 我在网上尝试了很多解决方案 包括C 使用 RijndaelManaged 和 Cryp
  • 无法使用 MinGW C++ 在 NetBeans IDE 7.3 中编译“Hello World”

    我正在尝试制作一个简单的 Hello World 在 NetBeans IDE 7 3 中使用 MinGW 作为我的 C 编译器来编写程序 我遇到了构建失败的情况 但我不知道为什么 这是我的编译器设置 Family MinGW 基本目录 C
  • 以 ASCII 字符串形式获取 MemoryStream 内容的快速方法

    我在 MemoryStream 中有一个 JSON 字符串 我使用以下代码将其作为 ASCII 字符串获取 MemoryStream memstream new MemoryStream Write a JSON string to mem
  • EWS 消息跟踪报告

    我一直在研究如何使用 EWS 从交换中获取消息跟踪报告 但似乎无法查明任何内容 我打算构建一个抓取日志文件的应用程序 但如果我可以通过 EWS 来完成它 那对我正在做的事情会更好 有任何想法吗 我终于能够为我的问题创建一个解决方案 我在 C
  • 在 WinForms 中显示输入对话框

    我想在我的 WinForm 应用程序中显示输入模式 我浏览过网络 但没有找到执行此操作的良好模式 我知道我必须创建另一个表单 并使用 ShowDialog 方法 你是对的 请注意 模式对话框在关闭时不会自动处理 与非模式对话框不同 因此您需
  • C++ 中的静态虚函数

    我有一个基类和一个派生类 我想更改基函数 同时保持它们静态 因为它们应该作为静态传递给其他函数 我怎样才能做到这一点 ATL 框架通过将基类设为模板 然后让派生类将其类类型作为模板参数传递 从而绕过了无虚拟静态的限制 然后 基类可以在需要时
  • 如何存储生成的格式化 C 字符串

    这是一个新手问题 为了创建格式化的 C 字符串 我使用printf like int n 10 printf My number is i 10 但是 怎么样 int n 10 char msg My number is i 10 prin
  • Windows Phone 8.1 应用程序多语言

    我正在使用 Visual Studio 2015 在 SilverLight 中创建 Windows Phone 应用程序 8 1 我正在用英语和阿拉伯语创建多语言应用程序 为此 我在项目中创建了 Strings 文件夹 其中包含 en U
  • cuda中有模板化的数学函数吗? [复制]

    这个问题在这里已经有答案了 我一直在寻找 cuda 中的模板化数学函数 但似乎找不到 在普通的 C 中 如果我调用std sqrt它是模板化的 并且将根据参数是浮点数还是双精度数执行不同的版本 我想要这样的 CUDA 设备代码 我的内核将真
  • 验证仅适用于数组的第一项

    给定这个模型代码 Required Display Name Name public string Name get set 以下查看代码有效 Html LabelFor model gt model Name Html TextBoxFo
  • 二叉树实现C++

    二叉树插入 include stdafx h include
  • 使用 Entity Framework Core 在运行时迁移

    我正在将 PHP Illuminate 应用程序移植到 ASP NET Core EF Core 其中一部分由类似 Wordpress 的安装过程组成 该过程要求提供数据库凭据 然后创建应用程序运行所需的表 本质上 我想在运行时运行某种迁移
  • C++ 头文件包含

    我正在开发一个项目 每个头文件都有一个预处理器包含防护 我的包含是这样的 文件 gt 包含 main cpp gt header h 字符 h header h gt 矢量 iostream DataFiles h Character h
  • C# - 平移光标

    我正在 PictureBox 控件中实现大图像的平移 并且设置适当的方向平移光标没有问题 但是 我似乎找不到用于平底锅原点的图像 内部带有箭头的圆圈 我在哪里可以找到它 我觉得image您正在寻找的内容未包含在框架中 每个应用程序都使用自己

随机推荐

  • 当谷歌广告不显示时,如何以编程方式折叠空 div 中的空间

    有没有什么方法可以以编程方式折叠谷歌广告未显示时产生的空白区域 如果是这样 我很想看到一个同样的说明性例子 四处搜寻让我发现这个谷歌官方资源 https support google com dfp premium answer 30726
  • 使用 pytorch 获取可用 GPU 内存总量

    我正在使用 google colab 免费 Gpu 进行实验 并想知道有多少 GPU 内存可供使用 torch cuda memory allocated 返回当前占用的 GPU 内存 但我们如何使用 PyTorch 确定总可用内存 PyT
  • 如何删除集合视图单元格以及此行为?

    我正在使用以下代码 此代码只是通过淡入淡出集合视图单元格并将其下方的其余部分向上移动来删除集合视图单元格 我不确定我应该如何制作这个动画 非常感谢您的帮助 func remove totalItems 1 data remove at it
  • 多次重复使用同一页面

    是否可以多次重用一页附加到不同的对象 我有一个页面 您可以输入个人信息 姓名 地址 社交号码 连接到一个 bean 潜在客户 在某些情况下 我必须收集链接的个人信息 信用评分示例 个人和担保人 所以我想与 2 个包含一起使用 但是我如何确保
  • 使用 jQuery 获取相对图像 src

    我的图像标签如下所示 img src path to my image jpg 但是当我使用 jQuery 访问 src 位时 jQuery 会返回 http example com path to my image jpg 这在我正在进行
  • 如何使用数据绑定设置点击侦听器并将 edittext 字段值传递给视图模型

    您好 我正在尝试在我的 Android 应用程序中使用数据绑定和 mvvm 架构 我想在布局中使用数据绑定添加点击侦听器并发送用户名和密码的值edittext到视图模型 它将执行 Web 服务并调用适当的方法LoginActivity li
  • OOP 的实际用途

    我最近和一位不喜欢的同事进行了一场辩论OOP http en wikipedia org wiki Object oriented programming 引起我注意的是他说的话 在对象中进行编码有什么意义 如果是重用 那么我可以创建一个库
  • 当组件因父级已从集合中删除而不再可见时,有没有办法获得通知?

    假设我有一个简单的 JFrame 其中 JTabbedPane 包含 3 个面板 第二个面板包含一个 JComponent 当 Tab 2 面板从其容器中删除时 有没有办法通知 JComponent 我的问题是 JComponent 可能位
  • activerecord 相当于 SQL '减号'

    从另一个查询结果中减去一个查询结果的rails方法是什么 数据库特定的 SQL 示例如下 SELECT Date FROM Store Information MINUS SELECT Date FROM Internet Sales 我将
  • 如何高效地重新编码和计数

    我有一个大的 csv 每行三个字符串 形式如下 a c d c a e f g f a c b c a d b f s c a c 我在前两列中将字符串重新编码为整数 然后删除重复项 计算每行有多少个副本 如下所示 import panda
  • Apps 脚本驱动应用服务 - 创建 Google 类型 - Mime 类型的文件

    我正在使用 createFile的方法DriveApp Folder班级 这是语法 createFile name content mimeType 文档在这里 createFile Google DriveApp 服务 https dev
  • 如何在 C/C++ 中格式化带有千位分隔符的数字

    我正在尝试做这个简单的任务 只是使用 C 或 C 格式化数字 但在 Windows CE 下编程 在这种环境中 inbue 和 setlocale 方法都不起作用 最后我这样做没有成功 char szValue 10 sprintf szV
  • 对 99 位数字长的大数进行因式分解的问题

    号码是 112887987371630998240814603336195913423482111436696007401429072377238341647882152698281999652360869 我的代码如下 def getfa
  • 如何从 Angular 4 更新/升级到 Angular 5+

    我需要将我的项目从 Angular 4 更新到 Angular 5 我需要将以下所有依赖项更改为 Angular 5 我还将 Angular CLI 更新到了 1 5 0 我尝试创建新项目 但似乎只创建了 Angular 4 项目 ng 新
  • 如何在图像内的任意点上旋转(以及可能的动画)图像?

    我正在使用 Flutter 并且希望图像在我定义的点上旋转 例如 我希望图像在其右上角设置旋转 向下摆动 的动画 我该怎么做呢 这是一个使用以下方法的解决方案FractionalOffset https docs flutter io fl
  • 导入错误:没有模块名称 urllib2

    这是我的代码 import urllib2 request response urllib2 urlopen http www google com html response read print html 有什么帮助吗 如中所述urll
  • ajax div 重新加载后 datepicker 不会启动

    我在 div 中有一个 jquery datepicker 通过 ajax 更新 我可以在整个页面重新加载后打开一次日期选择器 但是在ajax仅更新包含日期选择器输入的div后 我看不到日期选择器 我尝试过针对类似问题的解决方案 但没有成功
  • 在 Matlab 中使用 Pochhammer 符号

    我尝试使用一个脚本来评估波赫默符号 http mathworld wolfram com PochhammerSymbol html 上升阶乘 在Matlab中 但它无法评估pochhammer x n 每当x即使表达式在以下情况下有效 也
  • -bash: /usr/local/bin/virtualenvwrapper.sh: 没有这样的文件或目录 #10

    我没有 sudo 特权 当我跑步时 printf n s n s n s virtualenv export WORKON HOME virtualenvs source usr local bin virtualenvwrapper sh
  • 使用遗留头文件作为 c++20 模块

    我正在将旧代码转换为可作为 C 模块导入的代码 问题是我希望它仍然可以工作并且可以像旧的标头 源版本一样轻松维护 我该怎么做 如果可能的话 是否可以创建一个导出标头内容的模块 也可以接受任何其他可以让您维护旧的 cpp h 文件和模块文件的