另一个新手问题:
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
答案 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;
}
这将编译并运行并且没有歧义,因为编译器将使用相同的代码替换相同函数的使用。
重新声明函数是可以的。