如何不使用 `export` 关键字从模块中导出函数和 类?
How to export functions and classes from module not using `export` keyword?
我正在研究在我的宠物项目中使用 C++ 模块 TS 的机会。对我来说,一个重要的用例是包装遗留 headers.
假设我有一个 header 文件,其中包含一些函数和 类、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
。然后我在另一个源文件中使用这个模块,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
关键字来解决此问题,但这对于包装遗留 headers.
的用例来说是不可能的
我做错了什么?如何从 header?
导出所有可能的标识符
我认为有两点是错误的:
模块名称不能以std.
开头。当我尝试这样做时,出现错误
error C3674: could not find standard library module 'std.io'
如果您没有为 Visual Studio 安装标准库模块组件,则可能不会出现此错误。不过我不确定。
在您链接到的博客 post 中,有这样一条注释:
Note that you currently have to include your header in a .cpp file (or rename your header) because of a limitation in our compiler’s file handling.
确实如此,因为当我尝试使用扩展程序 ixx
时,我遇到了与您相同的错误。
但在解决以上两个问题后,它工作正常。
我正在研究在我的宠物项目中使用 C++ 模块 TS 的机会。对我来说,一个重要的用例是包装遗留 headers.
假设我有一个 header 文件,其中包含一些函数和 类、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
。然后我在另一个源文件中使用这个模块,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
关键字来解决此问题,但这对于包装遗留 headers.
我做错了什么?如何从 header?
导出所有可能的标识符我认为有两点是错误的:
模块名称不能以
std.
开头。当我尝试这样做时,出现错误error C3674: could not find standard library module 'std.io'
如果您没有为 Visual Studio 安装标准库模块组件,则可能不会出现此错误。不过我不确定。
在您链接到的博客 post 中,有这样一条注释:
Note that you currently have to include your header in a .cpp file (or rename your header) because of a limitation in our compiler’s file handling.
确实如此,因为当我尝试使用扩展程序
ixx
时,我遇到了与您相同的错误。
但在解决以上两个问题后,它工作正常。