1
8
这就是我如何解释标准。根据 basic.link/1 :
它既不说静态链接,也不说动态链接。程序是连接在一起的翻译单元。链接是否分两步完成并不重要(首先创建.dll/.so,然后创建动态 链接器 将所有动态libs+可执行文件链接在一起)。 所以,在我的解释中,不管程序是动态链接还是静态链接,实现的行为都应该相同:类静态变量应该是唯一的(不管它是内联的还是非内联的)。 在Linux上,这是真的。 在Windows上,这在所有情况下都不起作用,因此在我的解释中,它违反了这些情况下的标准(如果创建一个单独的.dll,其中包含静态、非内联变量,以及所有其他.dll和exe引用此变量,它就起作用)。 |
2
5
C++目前没有共享库的概念。那就这样吧
事实上 [basic.link]/1 声明: 程序由一个或多个链接在一起的翻译单元组成。 “并不意味着与另一个已经链接的模块链接在一起的程序的行为应该相同。 这些年来,已经提出了许多改善这一状况的建议。( N1400 , N1418 , N1496 , N1976 , N2407 , N3347 , N4028 没有一个从地上掉下来。很难用通用的方式来实现,C++通常试图避开实现细节。作为海湾合作委员会 put it :
默认情况下,MSVC不公开任何符号。任何“外部”符号都需要使用特定于平台的显式声明
|
3
1
由你来确保这一点(通过确保所有的声明事实上是相同的)。 编译器显然不能检查这个,链接器也不麻烦。所以如果你对链接器撒谎 不 这样做),你就会陷入麻烦。 好吧,因为不是每个人都明白我所说的“对链接器撒谎”的意思,我会把它充实一点。 @奥利弗,请提供 this link ,其中包括以下内容(我的评论):
很好,这就是我们需要的。问题是, 你不知道哪一个 (很明显,只保留了一个,所以通过扩展,您不知道会是哪个)。 所以, 如果他们不同 你不知道最后会是谁,所以你最终会是(一种特别阴险的形式)乌布。这就是我所说的“对链接者撒谎”。因为,通过在不同的tu中声明不同的变量,这正是您所做的。哎呀! |
notamaster · 匿名命名空间中的变量声明和其他位置的定义 2 年前 |
sovesti · 参数较少的模板函数中的演绎 2 年前 |
Lingxi · 使用内联静态数据成员有任何潜在的陷阱吗? 6 年前 |
Quuxplusone · 销毁不可销毁的基类? 6 年前 |