静态结构和一个定义规则
Static struct and One Definition Rule
1.cpp:
static struct SA {
int m=1;
int func() {return m;}
}g;
static void test() {
g.func();
}
2.cpp:
static struct SA {
int m=2;
int func() {return m*m;}
}g;
static void test() {
g.func();
}
(1( 在这种情况下是否违反了一个定义规则?(2( 如果不是,那么只有在某个地方引用SA时才违反ODR?
是的,违反了规则。比方说,如果两个.cpp都构建在同一个静态库中,并且使用了其中一个,则会产生UB。这是因为链接器无法区分两者,链接相当随机。当您链接定义相同符号的多个静态库时,也会发生同样的情况。Linker只是假设这些都是一样的。
事实上,由于标头中的函数/类定义,链接器经常不得不丢弃重复项。
IIRC共享库/.dll对这个问题更有弹性,因为只有数量有限的符号暴露在链接器中。
在C++20中,模块应该能够解决这些问题。
相关文章:
- 此代码是否违反一个定义规则
- 静态结构和一个定义规则
- 为什么转换函数声明不需要至少一个定义类型说明符
- 只有一个定义/声明时标头声明变量的多堆定义错误
- 一个定义规则 - 编译
- 为什么传递给函数 set::itrator 而不是 const_iterator 违反了一个定义规则?
- 内联函数和一个定义规则
- 如何在C 中应用ODR(一个定义规则)
- C++ 多个定义,即使只给出了一个定义
- std::integral_constant<T, v>::value 总是有一个定义吗?
- 为什么这不违反一个定义规则
- C 是纯虚拟函数,也是一个定义或仅声明
- 从标准库重新定义函数是否违反了一个定义规则
- 是否使用“ __Date__”或“ __Time__”违反了一个定义规则
- 非静态数据成员和一个定义规则
- 如何在C++中声明一个定义为func(cv::Mat &img)的函数
- 现代C和C :可以将一个定义的结构用于其他声明的结构
- C 是平行阵列一个定义的结构
- 当一个定义位于命名空间中时不明确的函数调用
- C++:同名的文件范围常量违反了一个定义规则