两个函数声明共享一个定义,这是合法的吗?

时间:2014-07-11 00:50:43

标签: c++ declaration language-lawyer

另一个新手问题:

int foo();  // outer foo function
int main() {
    int foo(); // inner foo function
    cout << foo() << endl;
}

int foo() { // one definition
    return 42;
}

根据我的理解,函数或对象的内部声明将隐藏外部声明(如果有的话) 所以上面的外部foo()和内部foo()应该是两个不同的函数 但他们正在分享一个似乎令人困惑的定义。 两个不同的函数共享一个定义是否合法?两个不同的对象变量怎么样? (这是C ++问题,但语法似乎也适合C。)

修改

使用指向函数的指针验证外部和内部foo是相同的函数:

pf_outer = 0x400792

pf_inner = 0x400792

2 个答案:

答案 0 :(得分:2)

重新声明这样的函数非常好,我们可以在两个地方的草案C ++标准中看到这一点,在3.1 部分声明和定义中说明:

  

声明(第7条)可以在a中引入一个或多个名称   前面介绍的翻译单位或重新声明的名称   声明。[...]

继续说:

  

声明是一个定义,除非声明没有的函数   指定函数的主体[...]

以及13.1 可重载声明段落 3 ,其中包含:

  

参数声明仅在使用等效项时有所不同   typedef“types”是等价的。 typedef不是一个单独的类型,但是   只是另一种类型的同义词(7.1.3)。 [例如:

 typedef int Int;

 void f(int i);
 void f(Int i); // OK: redeclaration of f(int)
 void f(int i) { /* ... */ }
 void f(Int i) { /* ... */ } // error: redefinition of f(int)
     

-end example]

两个声明都将引用相同的定义,不允许重新定义该函数。

函数声明也可以因outermost cv-qualifiers as well而不同。

答案 1 :(得分:2)

内部foo只是同一foo()的另一个前向减速。请考虑以下示例:

 int foo();
 int foo();

 int main() {
     cout << foo() << endl;
 }

 int foo() { // one definition
    return 42;
 }

这将编译并运行并且没有歧义,因为编译器将使用相同的代码替换相同函数的使用。

重新声明函数是可以的。