簡體   English   中英

c語言中的隱式int

[英]implicit int in c language

我正在使用 orwell dev c++ IDE。 我知道在舊的C89標准和預標准中,當函數定義中沒有明確指定函數的返回類型時,C++ 支持默認為 int規則。 但它在 C++ 中已被禁止。 但最近我寫了以下簡單的 C 程序,它工作正常。

#include <stdio.h>
void fun();
int main(void)
{
    int a=9;
    printf("%d",a);
    printf("%d",a);
    fun();
    return 0;
}
a=1;
void fun()
{
    printf("%d",a);
}

默認 int 規則是否也適用於變量? 我的編譯器向我顯示以下警告。

[Warning] data definition has no type or storage class [enabled by default] 

[Warning] type defaults to 'int' in declaration of 'a' [enabled by default]

為什么C99標准仍然允許默認為 int? 它在 C++ 中編譯失敗。 如果我錯了,請糾正我? 這個 C 程序也適用於像 ideone.com 這樣的在線編譯器

這在C99 原理中有解釋:

C99的一個新特性:

在 C89 中,可以從聲明中的聲明說明符中省略所有類型說明符。 在這種情況下,int 是隱含的。 委員會認為此功能的固有危險大於其便利性,因此將其刪除。 其效果是保證診斷的產生,該診斷將捕獲額外類別的編程錯誤。 發出診斷后,實現可以選擇假定隱式 int 並繼續翻譯程序,以支持利用此功能的現有源代碼。

換句話說,它已正式從 C99 標准中刪除,但編譯器可能仍會選擇遵循此行為並發出診斷信息,就像 GCC 所做的那樣。 例如,查看-Wimplicit-int警告選項頁面。 要將這些警告編譯為錯誤,請使用-pedantic-errors-Werror

根據@Anonymous 的回答, c++98包含有關類型說明符的類似規則。

7.1.5/2

聲明中至少需要一個不是cv 限定符的類型說明符,除非它聲明了構造函數、析構函數或轉換函數。 80)

80)對於缺少類型說明符或具有僅指定cv-qualifiers類型說明符decl-specifier-seq沒有特殊規定。 不再支持 C 的“隱式 int”規則。

例如, GCC支持 ISO/IEC 14882:1998 及更高版本,因此無論如何這都會是一個錯誤。

C99 標准不允許省略類型。

第 6.7.2.2 節說:

每個聲明的聲明說明符中以及每個結構聲明和類型名稱的說明符-限定符列表中應至少給出一個類型說明符。

暫無
暫無

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

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