几个功能的指针

时间:2012-08-28 20:41:46

标签: c++ c

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

#include <cassert>

void foo() {}

void bar() {}

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

4 个答案:

答案 0 :(得分:7)

C ++ 11标准说

  

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

如果您没有指向这些功能的指示,那么它们可能只有相同的地址,但我们不会知道。如果 将指针与两个不同的函数进行比较,则它们不能相等。


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

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

答案 1 :(得分:3)

是。 C99 6.5.10:6

  

两个指针比较相等,当且仅当两者都是空指针,两者   是指向同一个对象的指针(包括指向对象的指针)   一个子对象开头)或功能,...

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

  

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

我从中得到了什么:

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

答案 2 :(得分:2)

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

  

/ OPT:ICF 会导致将相同的地址分配给不同的地址   函数或只读数据成员(用。编译的const变量)   /戈瑞)。所以,/ OPT:ICF可以打破一个取决于地址的程序   函数或只读数据成员是不同的。见/ Gy(启用   功能级链接)以获取更多信息。

ICF :相同的代码折叠

答案 3 :(得分:1)

实施细节。

  

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