静态结构和一个定义规则

Static struct and One Definition Rule

本文关键字:一个 定义 规则 结构 静态      更新时间:2023-10-16

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中,模块应该能够解决这些问题。