#include <stdio.h>
int main()
{
void foo(), f();
f();
}
void foo()
{
printf("2 ");
}
void f()
{
printf("1 ");
foo();
}
输出:
1 2
声明如何在这里工作? 如果我在foo()之前定义F(),我就会收到错误。
错误!
#include <stdio.h>
int main()
{
void foo(), f();
f();
}
void f()
{
printf("1 ");
foo();
}
void foo()
{
printf("2 ");
}
错误
> main.c: In function 'f': main.c:21:13: error: incompatible implicit
> declaration of function 'foo'
> foo();
> ^ main.c:7:18: note: previous implicit declaration of 'foo' was here
> void foo(), f();
^
为什么会这样?
答案 0 :(得分:2)
这是一个范围问题。在第一个示例中,foo
和f
已知为main,因为您声明了它们。 f()
知道foo
,因为它已在它之前声明。
在您的第二个示例中,f
和foo
声明为main f()
的本地,foo
并不知道{{1}},因为它没有在它之前声明。
答案 1 :(得分:2)
我的编译器给出的错误消息是“隐式声明”。
您在主要范围内将函数f()
和foo()
声明为void
,。然后,您可以在该范围之外使用它们(即,您从foo()
内部调用f()
- 并在f
之外声明main
。)
编译器将此foo();
的{{1}}中的f()
视为“我第一次听到此函数” - 因为它不再属于main
的范围,它已经忘记了它在main
范围内被告知的所有内容(包括“foo()
和f()
的返回类型void
。”。没有任何信息,它将假设foo()
返回int
。当它最终遇到foo
的定义时,在代码中降低,它意识到它的假设是错误的。但不是它悄悄地修复它,它抱怨道。
那是你的C.
如果你在main()
之前提出声明,你的问题就会消失:
#include <stdio.h>
void foo(), f();
int main(void)
{
f();
}
void f()
{
printf("1 ");
foo();
}
void foo()
{
printf("2 ");
}
因此 - 问题不是你的函数的“多重声明”(正如你在问题的标题中暗示的那样) - 它是导致麻烦的声明的范围。
答案 2 :(得分:1)
它被称为“前向声明”。检查谷歌的详细信息,但在您的情况下:
void f();
void foo();
void f() { foo(); }
void foo() {}
int main { f(); return 0; }
答案 3 :(得分:0)
只要具有完全相同的声明,您可以根据需要重新声明某些内容。例如,以下内容有效:
void foo();
void foo();
void foo();
但是,void foo();
和foo();
不一样。后者隐含默认为int foo();
。这就是为什么你需要在调用之前定义foo();
,否则它将被视为重新声明/新声明。