首页 > 解决方案 > 我们是否应该在全局模块片段中为废弃变量的初始化声明所使用的废弃函数提供定义?

问题描述

当我在一个模块单元的全局模块片段中#include一个头文件时,我遇到了MSVC和GCC一起提供的一些链接错误。

首先,我有一个像这样的头文件“Header.h”

#pragma once
int f();

const int value = f();

然后,我定义了一个主模块接口单元[m1.ixx OR m1.cpp],如下所示:

module;
#include "Header.h"

export module m1;

export {
    inline int value2 = 0; // Not use anything in Header.h
}

最后,我将模块导入“main.cpp”并构建示例,“main.cpp”如下所示:

import m1;
#include <iostream>

int main()
{
    using namespace std;
    cout << value2 << endl;
}

我从 GCC11 收到了一些链接错误:

/usr/bin/ld: /tmp/ccEkMykg.o: 在函数`__static_initialization_and_destruction_0(int, int)'中:

m1.cpp:(.text+0x1e): 对“f()”的未定义引用

同样来自 MSVC 的链接错误:

严重性代码 描述 项目文件行抑制状态错误 LNK1120 1 unresolved externals Study2 C:\Users\Glx\source\repos\Study2\x64\Debug\Study2.exe 1

严重性代码描述项目文件行抑制状态错误 LNK2019 未解析的外部符号“int __cdecl f(void)”(?f@@YAHXZ) 在函数“void __cdecl `dynamic initializer for 'value''(void)”(??__Evalue) 中引用@@YAXXZ) Study2 C:\Users\Glx\source\repos\Study2\Study2\m1.ixx.obj 1

在我的理解中,变量和函数f()的声明应该被丢弃,因为它们是全局模块片段中的声明, 并没有被模块单元使用,所以即使我不提供定义也没关系对于函数 f()

我理解错了吗?

标签: c++c++20c++-modules

解决方案


模块上下文中的“丢弃”仅表示从模块中的模板定义中查找找不到它(作为编译客户端的一部分被实例化)。它if constexpr. _ value显然 odr-uses的定义f,所以它必须在某个地方定义。

同时,您根本不应该在头文件中包含内部链接。value


推荐阅读