?
Dieses Dokument verwendet PHP-Handbuch für chinesische Websites Freigeben
(有關(guān)大多數(shù)內(nèi)置類型的細(xì)節(jié)以及由C庫提供的與類型相關(guān)的實(shí)用程序的列表,另請參閱算術(shù)類型)。
對象,函數(shù)和表達(dá)式都有一個(gè)名為type的屬性,它決定了存儲(chǔ)在對象中或由表達(dá)式求值的二進(jìn)制值的解釋。
C型系統(tǒng)由以下類型組成:
方式 void
基本類型
方式 char
有符號(hào)整數(shù)類型
標(biāo)準(zhǔn):signed char
,short
,int
,long
,long long
(因?yàn)镃99)
擴(kuò)展:定義的實(shí)現(xiàn),例如 __int128
無符號(hào)整數(shù)類型
標(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)類型
真正的浮點(diǎn)類型:float
,double
,long double
復(fù)雜類型:float _Complex
,double _Complex
,long double _Complex
虛類型:float _Imaginary
,double _Imaginary
,long double _Imaginary
枚舉類型
派生類型
數(shù)組類型
結(jié)構(gòu)類型
工會(huì)類型
函數(shù)類型
指針類型
原子類型
對于上面列出的每種類型,可能存在幾種其類型的合格版本,對應(yīng)于const,volatile和restrict限定符(限定符語義所允許的)中的一個(gè),兩個(gè)或全部三個(gè)的組合。
對象類型:不是函數(shù)類型的所有類型
字符類型:char
,signed char
,unsigned char
整數(shù)類型:char
,有符號(hào)整數(shù)類型,無符號(hào)整數(shù)類型,枚舉類型
實(shí)際類型:整數(shù)類型和實(shí)際浮動(dòng)類型
算術(shù)類型:整數(shù)類型和浮點(diǎn)類型
標(biāo)量類型:算術(shù)類型和指針類型
聚合類型:數(shù)組類型和結(jié)構(gòu)類型
派生的聲明器類型:數(shù)組類型,函數(shù)類型和指針類型
在C程序中,引用不同翻譯單元中相同對象或函數(shù)的聲明不必使用相同的類型。他們只需使用足夠類似的類型,正式稱為兼容類型。同樣適用于函數(shù)調(diào)用和左值訪問; 參數(shù)類型必須與參數(shù)類型兼容,并且左值表達(dá)式類型必須與所訪問的對象類型兼容。
類型T
和U
兼容。
它們是相同的類型(由typedef引入的同名或別名)
它們是兼容的不合格類型的相同cvr合格版本
它們是指針類型,并指向兼容的類型
他們是數(shù)組類型,并且
他們的元素類型是兼容的,并且
如果兩者都具有恒定的大小,那么大小是相同的。注意:未知邊界的數(shù)組與兼容元素類型的任何數(shù)組兼容。VLA與任何兼容元素類型的陣列兼容。(自C99以來)
它們都是結(jié)構(gòu)/聯(lián)合/枚舉類型,并且
(C99)如果用標(biāo)簽聲明了一個(gè),另一個(gè)也必須用相同的標(biāo)簽聲明。
如果兩者都是完整類型,則它們的成員必須完全對應(yīng)數(shù)量,使用兼容類型聲明并具有匹配的名稱。
另外,如果它們是枚舉,相應(yīng)的成員也必須具有相同的值。
另外,如果他們是結(jié)構(gòu)或工會(huì),
相應(yīng)的成員必須以相同的順序進(jìn)行聲明(僅限結(jié)構(gòu))
相應(yīng)的位域必須具有相同的寬度。
一個(gè)是枚舉類型,另一個(gè)是枚舉的基礎(chǔ)類型
他們是功能類型,和
他們的返回類型是兼容的
它們都使用參數(shù)列表,參數(shù)的數(shù)量(包括使用省略號(hào))是相同的,相應(yīng)的參數(shù)具有兼容的類型
一個(gè)是舊樣式(無參數(shù))定義,另一個(gè)具有參數(shù)列表,參數(shù)列表不使用省略號(hào),每個(gè)參數(shù)在缺省參數(shù)后都與相應(yīng)的舊式參數(shù)兼容(在函數(shù)參數(shù)類型調(diào)整后)促銷
一個(gè)是舊式(無參數(shù))聲明,另一個(gè)是參數(shù)列表,參數(shù)列表不使用省略號(hào),所有參數(shù)(函數(shù)參數(shù)類型調(diào)整后)不受默認(rèn)參數(shù)促銷影響
該類型char
不兼容signed char
且不兼容unsigned char
。
如果兩個(gè)聲明引用相同的對象或函數(shù)并且不使用兼容的類型,則程序的行為是未定義的。
// 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 ++沒有兼容類型的概念。聲明在不同翻譯單元中兼容但不相同的兩種類型的AC程序不是有效的C ++程序。
不完整的類型是一種對象類型,缺少足夠的信息來確定該類型對象的大小。不完整的類型可能會(huì)在翻譯單元的某個(gè)位置完成。
以下類型不完整:
類型void
。這種類型無法完成。
未知大小的數(shù)組類型。它可以通過稍后聲明指定大小來完成。
未知內(nèi)容的結(jié)構(gòu)或聯(lián)合類型。它可以通過相同結(jié)構(gòu)或聯(lián)合的聲明來完成,該聲明稍后在相同范圍內(nèi)定義其內(nèi)容。
類型可能必須在聲明之外的上下文中命名。在這些情況下,使用類型名稱,在語法上,它與類型說明符和類型限定符列表完全相同,后面跟著聲明符(參見聲明),就像用來聲明單個(gè)對象或函數(shù)一樣類型,除了標(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í)符周圍的多余括號(hào)在類型名稱中有意義并且代表“沒有參數(shù)規(guī)范的函數(shù)”:
int (n); // declares n of type intsizeof(int ()); // uses type "function returning int"
類型名稱用于以下情況:
cast
sizeof
復(fù)合文字 | (自C99以來) |
---|---|
通用選擇alignof alignas _Atomic(當(dāng)用作類型說明符時(shí)) | (自C11以來) |
復(fù)合文字
(since C99)
generic selection
alignof
alignas
_Atomic(當(dāng)用作類型說明符時(shí))
(since C11)
類型名稱可能會(huì)引入新類型:
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類型(p:39-43)
6.2.6類型的表示(p:44-46)
6.2.7兼容型和復(fù)合型(p:47-48)
C99標(biāo)準(zhǔn)(ISO / IEC 9899:1999):
6.2.5類型(p:33-37)
6.2.6類型的表示(p:37-40)
6.2.7兼容型和復(fù)合型(p:40-41)
C89 / C90標(biāo)準(zhǔn)(ISO / IEC 9899:1990):
3.1.2.5類型
3.1.2.6兼容類型和復(fù)合類型