为什么在编译模块实现单元时会收到警告 C4844?

问题描述 投票:0回答:2

我正在尝试将模块实现的部分内容拆分为一个单独的源文件作为模块实现单元:

香蕉.cppm

export module banana;

export int banana();

banana.impl.cppm

module banana;

int banana() {
    return 42;
}

Visual Studio 抱怨此代码并发出警告 C4844:

1> 香蕉.impl.cppm(1,14): 警告 C4844: '导出模块香蕉;'是 现在是声明模块接口的首选语法

这是怎么回事?我怎样才能摆脱这个警告?

c++ visual-c++ c++20 c++-modules
2个回答
4
投票

Visual C++ 认为你的模块实现单元是模块接口单元。

发生这种情况有两种可能的方式:

  • 您可以使用
    /interface
    编译选项来编译模块实现源文件。右键单击源文件并转到
    Properties->Configuration Properties->C/C++->Advanced->Compile As
    并确保其 not 设置为
    Compile as C++ Module Code (/interface)
    。如果您使用 CMake 生成 Visual Studio 解决方案,请从
    CXX_MODULES
    FILE_SET
    中删除模块实现源。
  • 您正在使用模块文件扩展名(如
    .ixx
    .cppm
    )作为模块实现源文件。 Visual Studio 自动将它们视为模块接口。使用
    /TP
    编译选项覆盖此设置(将上面的
    Compile As
    属性设置为
    Compile As C++ Code (/TP)
    )或将文件扩展名更改为非模块文件扩展名,例如
    .cpp
    。我强烈建议更改文件扩展名,因为其他编译器类似地为模块文件扩展名分配特殊含义。

0
投票

i似乎有两种方法可以让您的示例发挥作用:

  1. 正如 ComicSansMS 所描述的(他就这类事情进行演讲,所以比我更有权威)。
  2. 对相关文件使用 /internalPartition 选项 - 设置方式与“Compile as C++”选项相同。这至少可以更明确地说明您对该文件的实际用途。如果我发现其他好处,我会进一步报告。
© www.soinside.com 2019 - 2024. All rights reserved.