【问题标题】:How to export functions and classes from module not using `export` keyword?如何不使用`export`关键字从模块中导出函数和类?
【发布时间】:2017-08-27 07:19:58
【问题描述】:

我正在研究在我的宠物项目中使用 C++ Modules TS 的机会。对我来说,重要的用例之一是包装遗留标头。

假设我有一个包含一些函数和类的头文件,std.io.ixx

int f(int x) 
{ 
    return 2 + x; 
} 

根据this article,我使用以下命令编译模块:

cl /c /experimental:module /module:name std.io /module:export std.io.ixx 

这给了我一个新文件std.io.ifc。然后我在另一个源文件 ma​​in.cxx 中使用这个模块:

import std.io;

int main()
{
    f(5);
}

使用以下命令编译:

cl /c /experimental:module main.cxx

编译时出现以下错误:

main.cxx(5): error C3861: 'f': identifier not found

所以,正如我们所见,模块中的标识符没有被导出。我可以通过在要导出的每个标识符之前手动添加 export 关键字来解决此问题,但这对于包装旧标头的用例是不可能的。

我做错了什么?如何从标头中导出所有可能的标识符?

【问题讨论】:

    标签: c++ module visual-studio-2017 c++20 c++-modules


    【解决方案1】:

    我认为有两点不对:

    1. 模块名称不能以std. 开头。当我尝试这样做时,我得到了错误

      error C3674: could not find standard library module 'std.io'
      

      如果您尚未安装 Visual Studio 的标准库模块组件,则可能不会出现此错误。不过,我不确定。

    2. 在您链接到的博客文章中,有这样的注释:

      请注意,由于我们编译器的文件处理限制,您目前必须将您的头文件包含在 .cpp 文件中(或重命名您的头文件)。

      确实是这样,因为当我尝试使用扩展名 ixx 时,我得到了和你一样的错误。

    但在解决了上述两个问题后,它工作正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-07
      • 1970-01-01
      • 2016-11-27
      • 1970-01-01
      • 2018-07-08
      • 1970-01-01
      相关资源
      最近更新 更多