[英]How multiple function declaration at a time works?
#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();
^
為什么會這樣呢?
這是范圍問題。 在第一個示例中, foo
和f
是main已知的,因為您已聲明它們。 f()
知道foo
因為它是在它之前聲明的。
在第二個示例中, f
和foo
的聲明是main的局部變量, f()
不知道foo
因為它不是在它之前聲明的。
我的編譯器給出的錯誤消息是“隱式聲明”。
您在main的范圍內將函數f()
和foo()
為void
。 然后,您可以在該范圍之外使用它們(即,您從f()
內部調用foo()
f()
-並且f
在main
外部聲明了)。
編譯器使用foo();
處理此encouter foo();
在f()
的第二行中是“我第一次聽說此函數”-由於它不再處於main
范圍內,因此它忘記了它在main
范圍內所得到的所有信息(包括“ return類型的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 ");
}
因此-問題不是函數的“多重聲明”(就像您在問題標題中所暗示的那樣)-正是聲明的范圍引起了麻煩。
它稱為“轉發聲明”。 檢查谷歌的詳細信息,但在您的情況:
void f();
void foo();
void f() { foo(); }
void foo() {}
int main { f(); return 0; }
只要它們具有完全相同的聲明,就可以多次聲明它們。 例如,以下內容有效:
void foo();
void foo();
void foo();
但是, void foo();
和foo();
不一樣 后者隱式默認為int foo();
。 這就是為什么需要定義foo();
在您調用它之前,否則它將被視為重新聲明/新聲明。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.