头文件中只有结构的预先声明,未有定义
2010-12-31 09:25
246 查看
我在头文件中,预先声明了一个结构,结构的定义在cpp文件中。头文件定义如下:
我在类中,定义了一个该结构的成员变量,编译有错误:该结构未定义。换成指针类型就可以了,如注释的语句。
为什么会出现该问题呢?
在网上查了一些相关内容,是说结构myTest没有定义,就不知道该结构的所占用的空间有多大,也就无法给类testClass分配空间;如果是指针变量,由于指针所占空间的大小是固定的,也就不存在不知道空间多大的问题了,所以就不会出错。
我平时在看C++书籍的时候,不是说编译只编译cpp文件,头文件仅仅扩展,为什么头文件又存在空间分配的问题?
看了网上的有关解释,我思考了一下,感觉应该是这样:虽然编译事情头文件不需要分配空间,但编译器要求类必须完整定义。不然另外一个cpp(不是你定义结构的cpp)需要使用这个类型,它怎么知道myTest是什么?而且,在以后需要分配空间的时候,你希望编译器再跑到你cpp里找定义,还是现在就记录定义信息,以后不再查找?虽然此时不需要分配空间,但是如果按照你设想的方法,每次需要分配空间时,编译器还是需要分析每个cpp文件,找到myTest的信息,这是非常非常没效率的。类型定义必须完整,这样才能使得编译器高效工作。
不知道该想法是否完全正确,如果错误,或有更好的解释,请大家指正。
#ifndef _TEST_H #define _TEST_H #endif struct myTest; class testClass { int a; myTest b; // myTest *b; };
我在类中,定义了一个该结构的成员变量,编译有错误:该结构未定义。换成指针类型就可以了,如注释的语句。
为什么会出现该问题呢?
在网上查了一些相关内容,是说结构myTest没有定义,就不知道该结构的所占用的空间有多大,也就无法给类testClass分配空间;如果是指针变量,由于指针所占空间的大小是固定的,也就不存在不知道空间多大的问题了,所以就不会出错。
我平时在看C++书籍的时候,不是说编译只编译cpp文件,头文件仅仅扩展,为什么头文件又存在空间分配的问题?
看了网上的有关解释,我思考了一下,感觉应该是这样:虽然编译事情头文件不需要分配空间,但编译器要求类必须完整定义。不然另外一个cpp(不是你定义结构的cpp)需要使用这个类型,它怎么知道myTest是什么?而且,在以后需要分配空间的时候,你希望编译器再跑到你cpp里找定义,还是现在就记录定义信息,以后不再查找?虽然此时不需要分配空间,但是如果按照你设想的方法,每次需要分配空间时,编译器还是需要分析每个cpp文件,找到myTest的信息,这是非常非常没效率的。类型定义必须完整,这样才能使得编译器高效工作。
不知道该想法是否完全正确,如果错误,或有更好的解释,请大家指正。
相关文章推荐
- c++ 自己创建的namespace,声明在h文件中,定义在cpp文件中,这种程序结构应该是合理的吧,欢迎不同见解的朋友来讨论。
- MYSQL数据文件--.frm文件(只有.frm文件时的表结构恢复)
- mingw gcc的头文件存在结构定义错误!!
- PE文件结构及在winnt.h中的定义
- 平面文件根据XSD定义生成对应的XML结构文件
- keil 中——C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法
- c++模板类/模板函数的声明与定义应该放在头文件里
- 定义与声明、头文件与extern总结(转)
- 变量与类的 声明和 定义 在头文件中的使用
- MYSQL数据文件--.frm文件(只有.frm文件时的表结构恢复)
- C++笔记: 定义,声明,头文件及其他
- c++高级---C++声明、定义、类的定义、头文件作用、头文件重复引用,不具名空间以及编译器编译链接过程
- 在工程.h 文件了定义了变量,依然在.cpp文件里报 未声明的变量,无法识别的标识符错误
- 模板函数声明与定义全都要放在.h文件中?为何不可以分开写?
- C++ 在.h文件中声明,在.cpp文件中定义 模板函数和模板类
- tiff文件结构定义的几个问题
- ServiceStack 项目实例 003 建议的文件结构定义及服务类说明
- 从libevent1.4到libevent2.0碰到的问题,struct evhttp_uri在头文件只有声明
- TAO下IDL结构定义编译文件分析
- C++ : 编译单元、声明和定义、头文件作用、防止头文件在同一个编译单元重复引用、static和不具名空间