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