例如: 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的值与原始值相同