1

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

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

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

根据这篇文章,我使用以下命令编译模块:

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

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

import std.io;

int main()
{
    f(5);
}

使用以下命令编译:

cl /c /experimental:module main.cxx

编译给了我以下错误:

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

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

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

4

1 回答 1

1

我认为有两件事是错误的:

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

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

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

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

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

    确实如此,因为当我尝试使用 extension 时ixx,我得到了和你一样的错误。

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

于 2017-04-07T20:52:20.550 回答