几个function的指针

有没有保证只有名称不同的函数(也不是参数和返回类型)不能在C和C ++中共享相同的地址? 我在标准中没有看到任何相关内容。

#include  void foo() {} void bar() {} int main() { assert(foo != bar); } 

C ++ 11标准说

5.10平等运营商
可以比较相同类型的指针(指针转换后)是否相等。 相同类型的两个指针比较相等,当且仅当它们都为空时,都指向相同的函数,或者两者都表示相同的地址(3.9.2)。

如果你没有任何指向函数的指针,它们可能只有相同的地址,但我们不知道。 如果要将指针与两个不同的函数进行比较,则它们不能相等。


混淆的一个原因可能是已知MSVC编译器将模板函数的代码组合在一起,恰好为不同类型(如intlong )生成相同的机器代码。 这不合规。

但是,这适用于具有不同签名的function,而不是这个问题的确切含义。

是。 C99 6.5.10:6

两个指针比较相等,当且仅当两个都是空指针时, 两者都是指向同一对象的指针(包括指向对象的指针和开头的子对象)或函数 ,……

编辑:段落的其余部分,因为它有一些重要性:

两者都指向一个超过同一个数组对象的最后一个元素的指针,或者一个是指向一个数组对象末尾的指针,另一个是指向紧跟在第一个数组对象之后的另一个数组对象的开头的指针地址空间中的数组对象。

我从中得到了什么:

  • 应用于错误操作数的等式,用许多词来说,是未指定的。 出于无关紧要的原因,这可能是偶然的,但是当你使用错误的方式时它不是未定义的<当你错误地使用它时未定义。
  • 据我所知,段落的其余部分不适用于函数,因为函数既不是对象也不是数组的元素。

许多打开优化的编译器会使两个函数具有相同的地址。 例如,来自msdn :

/ OPT:ICF 可以导致将相同的地址分配给不同的函数或只读数据成员(使用/ Gy编译的const变量)。 因此,/ OPT:ICF可以破坏依赖于函数地址或只读数据成员不同的程序。 有关更多信息,请参阅/ Gy(启用function级链接)。

ICF :相同的代码折叠

实施细节。

(C99,5.1.2.3p1)“本国际标准中的语义描述描述了抽象机器的行为,其中优化问题无关紧要。”