簡體   English   中英

為什么即使函數沒有在 main 之前聲明,這個在線編譯器也允許我編譯代碼?

[英]Why does this online compiler allow me to compile the code even if the functions are not declared before the main?

在線編譯器: https : //www.onlinegdb.com/online_c_compiler#

為什么這個編譯器讓我在沒有主函數之前的函數的情況下編譯代碼? 不應該是錯誤嗎?

在舊的 C 中有一種叫做隱式函數聲明的東西。 當出現對未聲明函數的調用時,它被假定為int()類型,即一個接受未指定數量參數並返回int的函數。

int main()
{
    foo(); // foo is implicitly declared as `int foo()`
}

由於 C99 這是非法的。 打開編譯器警告並使用正確的語言方言。

像這樣的怪癖,從晚年開始多了起來。 例如,您可以聲明沒有類型的函數參數,並且類型將是隱式int

int test(a) // a type is implicitly int
{
    a = 11;

    return a;
}

除非使用-pedantic否則上述內容甚至不會產生任何警告

如果你想瘋狂編譯這個:

double test(a, b)
    int a;
    double b;
{
    a = 11;
    b = 3.14;

    return a + b;
}

這是聲明變量的舊方法(K&R 時間),我沒有找到任何觸發警告的標志。

所以是的,舊的 C 很奇怪,即使在今天也能找到它的蹤跡。

C 編譯器通常默認使用早於最后一個 C 語言標准,並且可以輕松處理該語言歷史上可以容忍的錯誤。

您的錯誤是 30 年前曾經是常規法律代碼的錯誤之一。

您希望通過提供適當的選項來明確地指示您的編譯器嚴格遵守您的代碼。 對於最近構建的 gcc,它將是-std=c11 -Wall -Werror或一組類似的選項。

有問題的在線 IDE 似乎不支持將用戶指定的選項傳遞給底層編譯器,因此您在這里不走運。 用自己的電腦運行編譯器,或者找一個更好的在線IDE。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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