【发布时间】:2020-04-10 01:31:16
【问题描述】:
假设我有以下两个文件:
test.cpp
inline double pi { 3.1415 };
#include <iostream>
void test() {
std::cout << pi << std::endl;
}
和
main.cpp
inline double pi { 2.178 };
void test();
#include <iostream>
int main() {
std::cout << pi << std::endl;
test();
}
inline 变量默认具有外部链接。因此,根据单一定义规则 (ODR),我最初的想法是,只要将变量声明为内联并包含相同的确切定义,就可以跨多个翻译单元声明同一个变量p>
所以我的第一个问题是,即使变量是内联声明的,但它们在翻译单元中具有不同的定义,为什么这个程序会编译?
二、inline non-const和inline const变量有什么区别?
例如,如果你运行上面的代码,你应该得到以下输出
2.178
2.178
但是,如果您访问这两个文件并将pi 设为const double,即inline const double pi {3.1415} 和inline const double pi {2.178}
你会得到以下输出:
2.178
3.1415
这里到底发生了什么?
【问题讨论】:
-
如果这些定义不同,您将违反 ODR。那是UB。
-
当您将内联变量放入标题中时,您认为会发生什么?链接器不会检查 every 定义是否相同;它只会选择一个并运行它。至于你的第二个问题,如果一个变量是常量并且你从不尝试获取它的地址,那么无论它是否具有外部链接,编译器都可以安全地内联它。
-
@cigien 编译器没有抱怨,这就是为什么我很困惑。
-
@MutatingAlgorithm 没有什么可抱怨的。每个TU都很好。链接器最多可以诊断它。
-
每个问题一个问题。