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

Two functions declarations share one definition, is this legal?

本文关键字:定义 两个 函数 声明 共享 一个      更新时间:2023-10-16

另一个新手问题:

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和内部foo是同一个函数:

pf_outer = 0x400792
pf_inner = 0x400792

内部的foo只是同一个foo()的另一个正向减速。考虑下面的例子:

 int foo();
 int foo();
 int main() {
     cout << foo() << endl;
 }
 int foo() { // one definition
    return 42;
 }

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

可以重新声明函数

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

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

,接着说:

声明是定义,除非它声明了一个没有的函数指定函数体[…]

13.1 可重载声明段落3说:

形参声明的不同之处仅在于使用了等效性类型定义的"类型"是等价的。typepedef不是一个单独的类型,而是只是另一个类型的同义词(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]

两个声明将引用同一个定义,不允许重新定义函数。

的函数声明也可以通过最外层的cv-限定符来区分。