?
Ce document utilise Manuel du site Web PHP chinois Libérer
(有關(guān)大多數(shù)內(nèi)置類(lèi)型的細(xì)節(jié)以及由C庫(kù)提供的與類(lèi)型相關(guān)的實(shí)用程序的列表,另請(qǐng)參閱算術(shù)類(lèi)型)。
對(duì)象,函數(shù)和表達(dá)式都有一個(gè)名為type的屬性,它決定了存儲(chǔ)在對(duì)象中或由表達(dá)式求值的二進(jìn)制值的解釋。
C型系統(tǒng)由以下類(lèi)型組成:
方式 void
基本類(lèi)型
方式 char
有符號(hào)整數(shù)類(lèi)型
標(biāo)準(zhǔn):signed char
,short
,int
,long
,long long
(因?yàn)镃99)
擴(kuò)展:定義的實(shí)現(xiàn),例如 __int128
無(wú)符號(hào)整數(shù)類(lèi)型
標(biāo)準(zhǔn):_Bool
(自C99), , ,unsigned char
,,unsigned short
( 因?yàn)镃99)unsigned intunsigned longunsigned long long
擴(kuò)展:實(shí)現(xiàn)定義,例如 __uint128
浮動(dòng)類(lèi)型
真正的浮點(diǎn)類(lèi)型:float
,double
,long double
復(fù)雜類(lèi)型:float _Complex
,double _Complex
,long double _Complex
虛類(lèi)型:float _Imaginary
,double _Imaginary
,long double _Imaginary
枚舉類(lèi)型
派生類(lèi)型
數(shù)組類(lèi)型
結(jié)構(gòu)類(lèi)型
工會(huì)類(lèi)型
函數(shù)類(lèi)型
指針類(lèi)型
原子類(lèi)型
對(duì)于上面列出的每種類(lèi)型,可能存在幾種其類(lèi)型的合格版本,對(duì)應(yīng)于const,volatile和restrict限定符(限定符語(yǔ)義所允許的)中的一個(gè),兩個(gè)或全部三個(gè)的組合。
對(duì)象類(lèi)型:不是函數(shù)類(lèi)型的所有類(lèi)型
字符類(lèi)型:char
,signed char
,unsigned char
整數(shù)類(lèi)型:char
,有符號(hào)整數(shù)類(lèi)型,無(wú)符號(hào)整數(shù)類(lèi)型,枚舉類(lèi)型
實(shí)際類(lèi)型:整數(shù)類(lèi)型和實(shí)際浮動(dòng)類(lèi)型
算術(shù)類(lèi)型:整數(shù)類(lèi)型和浮點(diǎn)類(lèi)型
標(biāo)量類(lèi)型:算術(shù)類(lèi)型和指針類(lèi)型
聚合類(lèi)型:數(shù)組類(lèi)型和結(jié)構(gòu)類(lèi)型
派生的聲明器類(lèi)型:數(shù)組類(lèi)型,函數(shù)類(lèi)型和指針類(lèi)型
在C程序中,引用不同翻譯單元中相同對(duì)象或函數(shù)的聲明不必使用相同的類(lèi)型。他們只需使用足夠類(lèi)似的類(lèi)型,正式稱(chēng)為兼容類(lèi)型。同樣適用于函數(shù)調(diào)用和左值訪問(wèn); 參數(shù)類(lèi)型必須與參數(shù)類(lèi)型兼容,并且左值表達(dá)式類(lèi)型必須與所訪問(wèn)的對(duì)象類(lèi)型兼容。
類(lèi)型T
和U
兼容。
它們是相同的類(lèi)型(由typedef引入的同名或別名)
它們是兼容的不合格類(lèi)型的相同cvr合格版本
它們是指針類(lèi)型,并指向兼容的類(lèi)型
他們是數(shù)組類(lèi)型,并且
他們的元素類(lèi)型是兼容的,并且
如果兩者都具有恒定的大小,那么大小是相同的。注意:未知邊界的數(shù)組與兼容元素類(lèi)型的任何數(shù)組兼容。VLA與任何兼容元素類(lèi)型的陣列兼容。(自C99以來(lái))
它們都是結(jié)構(gòu)/聯(lián)合/枚舉類(lèi)型,并且
(C99)如果用標(biāo)簽聲明了一個(gè),另一個(gè)也必須用相同的標(biāo)簽聲明。
如果兩者都是完整類(lèi)型,則它們的成員必須完全對(duì)應(yīng)數(shù)量,使用兼容類(lèi)型聲明并具有匹配的名稱(chēng)。
另外,如果它們是枚舉,相應(yīng)的成員也必須具有相同的值。
另外,如果他們是結(jié)構(gòu)或工會(huì),
相應(yīng)的成員必須以相同的順序進(jìn)行聲明(僅限結(jié)構(gòu))
相應(yīng)的位域必須具有相同的寬度。
一個(gè)是枚舉類(lèi)型,另一個(gè)是枚舉的基礎(chǔ)類(lèi)型
他們是功能類(lèi)型,和
他們的返回類(lèi)型是兼容的
它們都使用參數(shù)列表,參數(shù)的數(shù)量(包括使用省略號(hào))是相同的,相應(yīng)的參數(shù)具有兼容的類(lèi)型
一個(gè)是舊樣式(無(wú)參數(shù))定義,另一個(gè)具有參數(shù)列表,參數(shù)列表不使用省略號(hào),每個(gè)參數(shù)在缺省參數(shù)后都與相應(yīng)的舊式參數(shù)兼容(在函數(shù)參數(shù)類(lèi)型調(diào)整后)促銷(xiāo)
一個(gè)是舊式(無(wú)參數(shù))聲明,另一個(gè)是參數(shù)列表,參數(shù)列表不使用省略號(hào),所有參數(shù)(函數(shù)參數(shù)類(lèi)型調(diào)整后)不受默認(rèn)參數(shù)促銷(xiāo)影響
該類(lèi)型char
不兼容signed char
且不兼容unsigned char
。
如果兩個(gè)聲明引用相同的對(duì)象或函數(shù)并且不使用兼容的類(lèi)型,則程序的行為是未定義的。
// Translation Unit 1struct S {int a;};extern struct S *x; // compatible with TU2's x, but not with TU3's x// Translation Unit 2struct S;extern struct S *x; // compatible with both x's// Translation Unit 3struct S {float a;};extern struct S *x; // compatible with TU2's x, but not with TU1's x // the behavior is undefined
// Translation Unit 1#include <stdio.h>struct s {int i;}; // compatible with TU3's s, but not TU2'sextern struct s x = {0}; // compatible with TU3's xextern void f(void); // compatible with TU2's fint main(){ f(); return x.i;}// Translation Unit 2struct s {float f;}; // compatible with TU4's s, but not TU1's sextern struct s y = {3.14}; // compatible with TU4's yvoid f() // compatible with TU1's f{ return;}// Translation Unit 3struct s {int i;}; // compatible with TU1's s, but not TU2's sextern struct s x; // compatible with TU1's x// Translation Unit 4struct s {float f;}; // compatible with TU2's s, but not TU1's sextern struct s y; // compatible iwth TU2's y // the behavior is well-defined: only multiple declarations// of objects and functions must have compatible types, not the types themselves
注意:C ++沒(méi)有兼容類(lèi)型的概念。聲明在不同翻譯單元中兼容但不相同的兩種類(lèi)型的AC程序不是有效的C ++程序。
不完整的類(lèi)型是一種對(duì)象類(lèi)型,缺少足夠的信息來(lái)確定該類(lèi)型對(duì)象的大小。不完整的類(lèi)型可能會(huì)在翻譯單元的某個(gè)位置完成。
以下類(lèi)型不完整:
類(lèi)型void
。這種類(lèi)型無(wú)法完成。
未知大小的數(shù)組類(lèi)型。它可以通過(guò)稍后聲明指定大小來(lái)完成。
未知內(nèi)容的結(jié)構(gòu)或聯(lián)合類(lèi)型。它可以通過(guò)相同結(jié)構(gòu)或聯(lián)合的聲明來(lái)完成,該聲明稍后在相同范圍內(nèi)定義其內(nèi)容。
類(lèi)型可能必須在聲明之外的上下文中命名。在這些情況下,使用類(lèi)型名稱(chēng),在語(yǔ)法上,它與類(lèi)型說(shuō)明符和類(lèi)型限定符列表完全相同,后面跟著聲明符(參見(jiàn)聲明),就像用來(lái)聲明單個(gè)對(duì)象或函數(shù)一樣類(lèi)型,除了標(biāo)識(shí)符被省略:
int n; // declaration of an intsizeof(int); // use of type name int *a[3]; // declaration of an array of 3 pointers to intsizeof(int *[3]); // use of type name int (*p)[3]; // declaration of a pointer to array of 3 intsizeof(int (*)[3]); // use of type name int (*a)[*] // declaration of pointer to VLA (in a function parameter)sizeof(int (*)[*]) // use of type name (in a function parameter) int *f(void); // declaration of functionsizeof(int *(void)); // use of type name int (*p)(void); // declaration of pointer to functionsizeof(int (*)(void)); // use of type name int (*const a[])(unsigned int, ...) = {0}; // array of pointers to functionssizeof(int (*const [])(unsigned int, ...)); // use of type name
除了標(biāo)識(shí)符周?chē)亩嘤嗬ㄌ?hào)在類(lèi)型名稱(chēng)中有意義并且代表“沒(méi)有參數(shù)規(guī)范的函數(shù)”:
int (n); // declares n of type intsizeof(int ()); // uses type "function returning int"
類(lèi)型名稱(chēng)用于以下情況:
cast
sizeof
復(fù)合文字 | (自C99以來(lái)) |
---|---|
通用選擇alignof alignas _Atomic(當(dāng)用作類(lèi)型說(shuō)明符時(shí)) | (自C11以來(lái)) |
復(fù)合文字
(since C99)
generic selection
alignof
alignas
_Atomic (when used as a type specifier)
(since C11)
類(lèi)型名稱(chēng)可能會(huì)引入新類(lèi)型:
void* p = (void*)(struct X {int i;} *)0;// type name "struct X {int i;}*" used in the cast expression// introduces the new type "struct X"struct X x = {1}; // struct X is now in scope
C11標(biāo)準(zhǔn)(ISO / IEC 9899:2011):
6.2.5類(lèi)型(p:39-43)
6.2.6類(lèi)型的表示(p:44-46)
6.2.7兼容型和復(fù)合型(p:47-48)
C99標(biāo)準(zhǔn)(ISO / IEC 9899:1999):
6.2.5類(lèi)型(p:33-37)
6.2.6類(lèi)型的表示(p:37-40)
6.2.7兼容型和復(fù)合型(p:40-41)
C89 / C90標(biāo)準(zhǔn)(ISO / IEC 9899:1990):
3.1.2.5類(lèi)型
3.1.2.6兼容類(lèi)型和復(fù)合類(lèi)型