Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么不同TU中的'static'函数不会破坏ODR?_C++_Static_Language Lawyer_Linkage_One Definition Rule - Fatal编程技术网

C++ 为什么不同TU中的'static'函数不会破坏ODR?

C++ 为什么不同TU中的'static'函数不会破坏ODR?,c++,static,language-lawyer,linkage,one-definition-rule,C++,Static,Language Lawyer,Linkage,One Definition Rule,ODR允许我们多次定义相同的内联函数(有一些限制) 但是,静态函数的简单情况如何 // First TU static int foo() { return 0; } int bar1() { return foo(); } // Second TU static int foo() { return 1; } int bar2() { return foo(); } 如果我们快速阅读[basic.def.odr]p4,我们会天真地得出这样的结论: 每个程序应包含该程序中odr使用的每个非内

ODR允许我们多次定义相同的内联函数(有一些限制)

但是,
静态
函数的简单情况如何

// First TU
static int foo() { return 0; }
int bar1() { return foo(); }

// Second TU
static int foo() { return 1; }
int bar2() { return foo(); }
如果我们快速阅读[basic.def.odr]p4,我们会天真地得出这样的结论:

每个程序应包含该程序中odr使用的每个非内联函数或变量的一个定义,该定义不在丢弃的语句中(9.4.1);无需诊断

在C++标准中,指定每个<代码> FoO < /C>是不同的函数,因此即使在它们的名称相同时也不会破坏ODR(

)。 这仅仅是阅读[basic.link]p2.2的问题吗(即,由于内部链接,名称不涉及同一实体,因此[basic.def.odr]p4不适用于此处)?或者是否有更多的细微差别/规则涉及到这个决定(比如[basic.scope]中的某些内容)


请注意,对于未命名的名称空间,结果是明确的,因为名称已经不同/唯一。

正确-即使它们在本地具有相同的名称,但它们是两个不同的函数/实体,因此没有冲突

当名称具有内部链接时,它所表示的实体可以由同一翻译单元中其他作用域的名称引用

如果名称空间作用域是显式声明为静态的变量、变量模板、函数或函数模板的名称,则名称空间作用域具有内部链接;或[…]


我无法立即找到任何适用的进一步措辞(规范性或其他措辞),但我认为我们不需要任何措辞。

由于内部链接,这些名称并不指同一实体,因此odr在这里并不完全适用。@Acorn抱歉,我忽略了标记。@πάνταῥεῖ 没问题!:)告诉我们关于虫子的事!链接相关的函数总是会带来很大的伤害…@Acorn我们预期会有一个特定的行为,但没有发生,因为TU本地函数是在没有
static
说明符的情况下定义的,链接器采用了从另一个TU找到的第一个定义,该定义后来添加到项目中:)。在我们发现后,我甚至发布了一篇不太受欢迎的文章。@Brian实际上,这看起来像是丢失的那篇!我说的是OP想要的。