C++工程中包含头文件的问题
我一直都是先建立文本文件,然后重命名为h和cpp,用VC打开,然后写代码,写完之后用VC编译连接执行,以前都没有问题,因为以前写的程序都是小程序,现在写一些大程序了,就按...
我一直都是先建立文本文件,然后重命名为h和cpp,用VC打开,然后写代码,写完之后用VC编译连接执行,以前都没有问题,因为以前写的程序都是小程序,现在写一些大程序了,就按照模块设计,分别写成几个不同的文件,比方说有A类和B类,和一个main函数,main里调用A,A里调用B,就有A.h、A.cpp、B.h、B.cpp和main.cpp这样五个文件,在A.h里include了B.h,在main.cpp里包含了A.h,VC编译没问题,但是连接不通过,一直说有未声明的变量,也就是那个著名的error LNK2001。后来我改变方法,先是在VC下创建空工程,然后把写好的文件包含进去,这样就能通过链接了。其实到此为止问题算是解决了,但是我无法理解的是,为什么先前的方法不能通过链接呢??
二楼的,再问你一个问题,就拿我刚才的例子来说,A.cpp文件只是被包含进了工程里面而已,没有被include,那么VC是如何知道A.h中的声明,在A.cpp中有实现呢?我觉得是这样的你看对不:VC在遇到标识符的时候会在整个工程里面查找其实现。 展开
二楼的,再问你一个问题,就拿我刚才的例子来说,A.cpp文件只是被包含进了工程里面而已,没有被include,那么VC是如何知道A.h中的声明,在A.cpp中有实现呢?我觉得是这样的你看对不:VC在遇到标识符的时候会在整个工程里面查找其实现。 展开
3个回答
展开全部
C++工程中包含头文件的问题:
1:如果有共同相关依赖(必须include)的类,比如A,B都依赖D可以放在一起,然后直接Include
“d”类的使用者只需关心与本类暴露出的相关类型,内部用到的类型不用去管(不用自已去include d)。这样
给出的class,调用者才更好用(不用去看代码查找,是不是还需要包含其它头文件)。
2:如果A类依赖D B类不依赖D,可以把它们分开两个头文件。各自Include。这样可避免当D发生变化时, 避免不必要重编译。
3:类中尽量采用指针或引用方式调用其它类,这样就可以只声明class xxx了。并且这也符合资源最优 利用,更利于使用多态。
1:如果有共同相关依赖(必须include)的类,比如A,B都依赖D可以放在一起,然后直接Include
“d”类的使用者只需关心与本类暴露出的相关类型,内部用到的类型不用去管(不用自已去include d)。这样
给出的class,调用者才更好用(不用去看代码查找,是不是还需要包含其它头文件)。
2:如果A类依赖D B类不依赖D,可以把它们分开两个头文件。各自Include。这样可避免当D发生变化时, 避免不必要重编译。
3:类中尽量采用指针或引用方式调用其它类,这样就可以只声明class xxx了。并且这也符合资源最优 利用,更利于使用多态。
展开全部
如果这个要往深处说,就关系到VC编译器如何编译多个文件的问题。简单的说,VC对项目的管理是以工程为基础的(其实这些和makefile有一定关系,因为VC必须要生成编译的脚本才知道如何去编译这些彼此依赖的文件,而这个脚本的生成是和工程里包含的文件相关的),工程里的文件必须显式的添加,意思即不仅这些文件位于同一目录下,并且也是在工程里手动添加过的。这样可以避免一些错误,同时由你手动添加,也从你的角度上保证了文件的正确性。
补充: 仍然有问题,include这个只是针对文件这一级的,和是不是类没有关系,对于编译器,它认为你include的是这个文件的所有代码,而并不关心里面是不是类。我前面已经提到了,编译和链接的控制是脚本控制的,所以并不是在工程内部寻找文件,但是从VC表面的做法来看,应该工程内部的文件是生成脚本的一个基础。
换个角度来说,假如没有VC,如何对这种情况编译?就是写脚本告诉链接器这些项目文件彼此之间的依赖关系,这个脚本就是现在的makefile文件。那为什么要用VC?就是用VC对所有文件进行管理,你既然不添加到工程里来,利用VC更方便的编译链接方法,又何必用VC来编译对吧?
我想反面的解释很好一些,这个只是基于软件设计上的考虑。对于软件上的这些,不必过于深究,知道即可
补充: 仍然有问题,include这个只是针对文件这一级的,和是不是类没有关系,对于编译器,它认为你include的是这个文件的所有代码,而并不关心里面是不是类。我前面已经提到了,编译和链接的控制是脚本控制的,所以并不是在工程内部寻找文件,但是从VC表面的做法来看,应该工程内部的文件是生成脚本的一个基础。
换个角度来说,假如没有VC,如何对这种情况编译?就是写脚本告诉链接器这些项目文件彼此之间的依赖关系,这个脚本就是现在的makefile文件。那为什么要用VC?就是用VC对所有文件进行管理,你既然不添加到工程里来,利用VC更方便的编译链接方法,又何必用VC来编译对吧?
我想反面的解释很好一些,这个只是基于软件设计上的考虑。对于软件上的这些,不必过于深究,知道即可
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
啥问题?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询