如何从不使用`export`关键字的模块导出函数和类?

时间:2017-04-02 10:51:55

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

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

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

Cannot read property 'scrollHeight' of undefined.

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

$('#fullpage').fullpage({
    sectionsColor: ['yellow', 'orange', '#C0C0C0', '#ADD8E6'],
    scrollOverflow: true
});
$('.fp-scrollable').slimScroll({
    alwaysVisible: true,
    color: 'black',
    size: '10px',
    allowPageScroll: true,
});

这给了我一个新文件int f(int x) { return 2 + x; } 。然后我在另一个源文件 main.cxx

中使用此模块
cl /c /experimental:module /module:name std.io /module:export std.io.ixx 

使用以下命令编译:

std.io.ifc

编译给出了以下错误:

import std.io;

int main()
{
    f(5);
}

因此,正如我们所看到的,模块中的标识符未被导出。我可以通过在我要导出的每个标识符之前手动添加cl /c /experimental:module main.cxx 关键字来解决此问题,但这对于包装旧标头的用例是不可能的。

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

1 个答案:

答案 0 :(得分:1)

我认为有两件事是错的:

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

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

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

  2. 在您关联的博文中,有这样的说明:

      

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

    确实是这种情况,因为当我尝试使用扩展程序ixx时,我遇到了与您相同的错误。

  3. 但在解决了上述两个问题之后,它运作良好。