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