一次多个函数声明如何工作?

时间:2014-01-30 18:19:59

标签: c function

#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();

              ^

为什么会这样?

4 个答案:

答案 0 :(得分:2)

这是一个范围问题。在第一个示例中,foof已知为main,因为您声明了它们。 f()知道foo,因为它已在它之前声明。

在您的第二个示例中,ffoo声明为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();,否则它将被视为重新声明/新声明。