有时候我们在一些编译器写代码的时候会碰见不完全类型这个编译错误,那么什么是不完全类型,为啥会出现呢
不完全类型指“函数之外、类型的大小不能被确定的类型”,只能以有限方式使用。不能定义该类型的对象。不完全类型只能用于定义指向该类型的指针及引用 [1] ,或者用于声明使用该类型作为形参类型或者返回值类型。
C的类型分为:
-
对象类型(char、int、数组、指针、结构体等)
-
函数类型
-
不完全类型
结构体的声明就是一个不完全类型的典型例子。
1 2 3 4 5 6 7 8 9 10 11 12 |
|
不完全类型也就是不知道变量的所有的类型信息。比如可以声明一个数组,但是不给出该数组的长度;声明一个指针,但是不给出该指针的类型;声明一个结构体类型,但是不给出完整的结构体定义,只说它是一个结构体。但是最终你必须得给出完整的类型信息。要不然编译会报错的。编译器在编译某个单元时,如果遇到一个不完全类型的定义的类型或变量(假设它叫p),它会把这当作正常现象,然后继续编译该单元,如果在本单元内找不到p完整的类型信息,它就去其它编译单元找。如果把整个编译过程分为编译、链接两个过程。在编译阶段遇到不完全类型是正常的,但是在链接过程中,所有的不完全类型必须存在对应的完整类型信息,否则报错。
举个例子,下面的代码先声明了一个不完全类型的变量字符数组str,没有给出它的长度信息。然后再定义了一次str数组,这次给出的长度信息。
1 2 |
|
注意:不完全类型定义不适合局部变量,如果把上面两行代码放在一个函数体中,会出现符号重定义错误。
不完全类型由于不包含具体的类型信息,所以不能通过sizeof来获得其大小。(编译器君的旁边:我连它的完整类型都不知道,我怎么告诉你它的大小。)下面的代码不能编译通过。它会报错 error: invalid application of `sizeof' to an incomplete type 不能对不完全类型使用sizeof。
也就是不完整类型的类型号。不能用来定义对象。
而需要定义包含具体的类型实现的头文件,
比如ostringstream out,这个如果不包含头文件sstream,注意不是sstream.h,那么就会在编译的时候出现不完全类型这个错误。
前置声明也属于不完全类型。
本文转自:百度百科-不完全类型