簡體   English   中英

一次多功能聲明如何工作?

[英]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();

              ^

為什么會這樣呢?

這是范圍問題。 在第一個示例中, foof是main已知的,因為您已聲明它們。 f()知道foo因為它是在它之前聲明的。

在第二個示例中, ffoo的聲明是main的局部變量, f()不知道foo因為它不是在它之前聲明的。

我的編譯器給出的錯誤消息是“隱式聲明”。

在main的范圍內將函數f()foo()void 然后,您可以在該范圍之外使用它們(即,您從f()內部調用foo() f() -並且fmain外部聲明了)。

編譯器使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM