我们是否应该为全局模块片段中废弃变量的初始值设定项声明所使用的废弃函数提供定义?
Should we provide a definition for a discarded function used by a discarded variable's initializer declaration in global module fragment?
当我在一个模块单元的全局模块片段中#include 一个头文件时,我遇到了 MSVC 和 GCC 一起提供的一些 link 错误。
首先,我有一个头文件 "Header.h" 像这样:
#pragma once
int f();
const int value = f();
然后,我定义了一个主模块接口单元 [m1.ixx 或 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 中得到一些 link 错误:
/usr/bin/ld: /tmp/ccEkMykg.o: in function
`__static_initialization_and_destruction_0(int, int)':
m1.cpp:(.text+0x1e): undefined reference to `f()'
和类似的 link 来自 MSVC 的错误:
Severity Code Description Project File Line Suppression State
Error LNK1120 1 unresolved externals Study2 C:\Users\Glx\source\repos\Study2\x64\Debug\Study2.exe 1
Severity Code Description Project File Line Suppression State
Error LNK2019 unresolved external symbol "int __cdecl f(void)" (?f@@YAHXZ) referenced in function "void __cdecl `dynamic initializer for 'value''(void)" (??__Evalue@@YAXXZ) Study2 C:\Users\Glx\source\repos\Study2\Study2\m1.ixx.obj 1
在我的理解中,变量value和函数f()的声明应该丢弃 因为它们是 全局模块片段 中的声明
并且不被模块单元使用,所以即使我不提供函数的定义也没关系 f().
我是不是理解错了?
模块上下文中的“丢弃”仅表示通过查找模块中的 模板定义 找不到它(作为编译客户端的一部分实例化)。它与 if constexpr
中丢弃的 语句 的含义不同。 value
的定义显然是 odr-uses f
,所以它必须在某处定义。
与此同时,您根本不应该在头文件中包含 internal-linkage 之类的东西 value
。
当我在一个模块单元的全局模块片段中#include 一个头文件时,我遇到了 MSVC 和 GCC 一起提供的一些 link 错误。
首先,我有一个头文件 "Header.h" 像这样:
#pragma once
int f();
const int value = f();
然后,我定义了一个主模块接口单元 [m1.ixx 或 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 中得到一些 link 错误:
/usr/bin/ld: /tmp/ccEkMykg.o: in function `__static_initialization_and_destruction_0(int, int)':
m1.cpp:(.text+0x1e): undefined reference to `f()'
和类似的 link 来自 MSVC 的错误:
Severity Code Description Project File Line Suppression State Error LNK1120 1 unresolved externals Study2 C:\Users\Glx\source\repos\Study2\x64\Debug\Study2.exe 1
Severity Code Description Project File Line Suppression State Error LNK2019 unresolved external symbol "int __cdecl f(void)" (?f@@YAHXZ) referenced in function "void __cdecl `dynamic initializer for 'value''(void)" (??__Evalue@@YAXXZ) Study2 C:\Users\Glx\source\repos\Study2\Study2\m1.ixx.obj 1
在我的理解中,变量value和函数f()的声明应该丢弃 因为它们是 全局模块片段 中的声明 并且不被模块单元使用,所以即使我不提供函数的定义也没关系 f().
我是不是理解错了?
模块上下文中的“丢弃”仅表示通过查找模块中的 模板定义 找不到它(作为编译客户端的一部分实例化)。它与 if constexpr
中丢弃的 语句 的含义不同。 value
的定义显然是 odr-uses f
,所以它必须在某处定义。
与此同时,您根本不应该在头文件中包含 internal-linkage 之类的东西 value
。