例如:
class X; // X 是一个非完整类型
extern X* xp; // xp是一个指向一个非完整类型的指针
extern int arr[]; // arr的类型是非完整的
typedef int UNKA[]; // UNKA是一个非完整类型
UNKA* arrp; // arrp是一个指向一个非完整类型的指针
void foo()
{
xp++; // ill-formed: X is incomplete
arrp++; // ill-formed: incomplete type
}
struct X { int i; }; // now X is a complete type
int arr[10]; // now the type of arr is complete
X x;
void bar()
{
xp = &x; // OK:type is “pointer to X”
arrp = &arr; // ill-formed: different types
xp++; // OK: X is complete
arrp++; // ill-formed: UNKA can’t be completed
}
scalar type——标量类型(或纯量类型)
算术类型、枚举类型、指针类型、成员指针类型(pointer to member types)、以及由CV-qulifiers限定的前面这些类型,都叫做标量类型。
POD types(POD,Plain Old Data)——POD类型
标量类型、POD-struct类型、POD-union类型、以及这些类型的数组或CV-qulifiers限定版本,统称为POD类型。
对于POD类型T的对象,不管这个对象是否拥有类型T的有效值,如果将该对象的底层字节序列拷贝到一个字符数组(或者无符号字符数组)中,再将其拷贝回对象,那么该对象的值与原始值一样。例如:
#define N sizeof(T) char buf[N];
T obj; memcpy(buf,&obj, N); memcpy(&obj, buf, N); //此时obj的值与原始值相同