我们是否应该为全局模块片段中被丢弃变量的初始值设定项声明所使用的被丢弃函数提供定义?

问题描述

当我在一个模块单元的全局模块片段中#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 的类似链接错误

严重性代码描述项目文件行抑制状态 Error 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:\用户\Glx\source\repos\Study2\Study2\m1.ixx.obj 1

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

我理解错了吗?

解决方法

模块上下文中的“丢弃”只是意味着它没有通过从模块中的模板定义中查找而找到(作为编译客户端的一部分被实例化)。它与 if constexpr 中丢弃的 语句 不同。 value 的定义显然是 odr 使用 f,所以它必须在某处定义。

同时,您根本不应该在头文件中包含诸如 value 之类的内部链接

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...