C++结构体中用逗号同时定义指针为何报‘字段类型不完整’错误?
为什么结构体中用逗号分隔声明指针会报“field has incomplete type”错误?
先看报错的代码:
struct Element { Element* prevPtr = nullptr, nextPtr = nullptr; };
问题出在C++的声明语法规则上:指针修饰符*是绑定到单个变量名的,而非整个类型。上面的代码其实等价于:
struct Element { Element* prevPtr = nullptr; Element nextPtr = nullptr; // nextPtr是Element类型的对象,不是指针 };
在结构体Element的定义过程中,它属于不完全类型(还没完成整个结构体的定义),C++不允许用不完全类型直接定义对象——因为编译器此时不知道Element的大小,无法分配内存,所以会抛出“field has incomplete type”错误。
再看能正常运行的代码:
struct Element { Element* prevPtr = nullptr; Element* nextPtr = nullptr; };
这里每个变量都明确标注了Element*类型,两个都是指向Element的指针。而C++允许用不完全类型声明指针(因为指针的大小是固定的,不管指向的类型有没有完全定义),所以编译器能正常处理。
如果想在一行用逗号分隔声明多个指针,必须给每个变量都加上*,比如:
struct Element { Element* prevPtr = nullptr, *nextPtr = nullptr; };
这样nextPtr也会被声明为Element*类型,就能正常编译了。
内容的提问来源于stack exchange,提问作者chaohuang
相关产品推荐
相关产品推荐

