C++工程中包含头文件的问题

我一直都是先建立文本文件,然后重命名为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在遇到标识符的时候会在整个工程里面查找其实现。

  C++工程中包含头文件的问题:
  1:如果有共同相关依赖(必须include)的类,比如A,B都依赖D可以放在一起,然后直接Include
“d”类的使用者只需关心与本类暴露出的相关类型,内部用到的类型不用去管(不用自已去include d)。这样
给出的class,调用者才更好用(不用去看代码查找,是不是还需要包含其它头文件)。
  2:如果A类依赖D B类不依赖D,可以把它们分开两个头文件。各自Include。这样可避免当D发生变化时, 避免不必要重编译。

  3:类中尽量采用指针或引用方式调用其它类,这样就可以只声明class xxx了。并且这也符合资源最优 利用,更利于使用多态。
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-10-14
如果这个要往深处说,就关系到VC编译器如何编译多个文件的问题。简单的说,VC对项目的管理是以工程为基础的(其实这些和makefile有一定关系,因为VC必须要生成编译的脚本才知道如何去编译这些彼此依赖的文件,而这个脚本的生成是和工程里包含的文件相关的),工程里的文件必须显式的添加,意思即不仅这些文件位于同一目录下,并且也是在工程里手动添加过的。这样可以避免一些错误,同时由你手动添加,也从你的角度上保证了文件的正确性。

补充: 仍然有问题,include这个只是针对文件这一级的,和是不是类没有关系,对于编译器,它认为你include的是这个文件的所有代码,而并不关心里面是不是类。我前面已经提到了,编译和链接的控制是脚本控制的,所以并不是在工程内部寻找文件,但是从VC表面的做法来看,应该工程内部的文件是生成脚本的一个基础。

换个角度来说,假如没有VC,如何对这种情况编译?就是写脚本告诉链接器这些项目文件彼此之间的依赖关系,这个脚本就是现在的makefile文件。那为什么要用VC?就是用VC对所有文件进行管理,你既然不添加到工程里来,利用VC更方便的编译链接方法,又何必用VC来编译对吧?

我想反面的解释很好一些,这个只是基于软件设计上的考虑。对于软件上的这些,不必过于深究,知道即可本回答被提问者采纳
第2个回答  2010-10-14
啥问题?

C++工程中包含头文件的问题
C++工程中包含头文件的问题:1:如果有共同相关依赖(必须include)的类,比如A,B都依赖D可以放在一起,然后直接Include “d”类的使用者只需关心与本类暴露出的相关类型,内部用到的类型不用去管(不用自已去include d)。这样 给出的class,调用者才更好用(不用去看代码查找,是不是还需要包含其它...

C\/C++头文件以及避免头文件包含造成的重定义方法
C\/C++编程中,头文件是关键元素,它们包含了函数声明、宏定义等,用于多个源文件共享。标准做法是将常量、宏、全局变量和函数原型写在头文件中,通过预处理指令#include引用。头文件包含时要特别注意,避免多次引用导致的重复内容,通常采用条件编译(如#ifndef...#define...#endif结构)来包裹整个头文件...

记一次 C++20 包含 thread 头文件编译报错问题排查
省略了之前的错误内容,错误信息显示是包含头文件后导致的。问题排查:首先,我尝试了无脑但实用的排除法,将问题源文件的代码反复删减,例如删除其他头文件,最终发现,仅剩一行 #include 代码时仍然报错。为了验证是否为 GCC 的 bug,我手动创建了一个文件,仅包含一行代码,然后使用 g++ -std=c++20 -...

C++调用类头文件为什么只需要include声明部分而不需要类的定义部分
由于C++语言支持多文件工程。需要经过编译和连接的过程。打个比方,你要建造一架飞机,需要发动机,机翼,机身,尾翼,起落架。你可以把这几个部分交给专门的厂商去制作,这就是编译过程。这么多零件交给你,你只需要组装起来就可以了,这就是连接过程。编译器(比如VC)就是加工零件的工厂,通过编译器的...

C++头文件包含了,还打不开?
包含头文件里面如果没有写路径就必须是在当前路径或系统路径中存在的。解决方法:1,你所用的那个方法,也即拷贝到同一路径下 2,include中加上相对路径,比如"a\/printBinary.h"3,在项目属性中设置include路径。

关于C++头文件包含的问题 #ifndef #define #endif
A: 包含的时候直接跳过的。(不过这个包含是在编译的时候才做的事)Q:这是对一个CPP文件是这样的,假设AB都写了#ifndef #endif,但是AB在另一个CPP里面出现了,这句#ifndef #endif是不是不起作用,A:起作用。Q:即#ifndef #endif只是保证同一个CPP中的头文件不会重复编译?A:#ifndef会...

c++程序哪些应该放在头文件里面,哪些应该放在源文件里面?
从软件库开发的角度,头文件应仅包含 public APIs,实现细节都应放在源文件中。这能保护源代码,使用户仅需查看API,便于查询。开发者能通过这种方式更新库的实现,用户只需更新并重新链接即可,无需重新编译,提高开发效率。头文件和源文件的区分还有助于优化编译时间和运行程序体积。头文件中的公共接口...

C\/C++ 头文件引用问题【整理】
,引用为include “scr\/test.h"如果在Header Search Paths中添加(SRCROOT)\/scr,那么头文件引用直接引用 include “test.h”如果有多个.a文件格式就像这样 (inherited) "(SRCROOT)\/xxxx" "(SRCROOT)\/xx"如果取的是相对是绝对路径那么工程移到别的地方就有可能导致运行出错。所以要改成相对路径 ...

C++程序在使用GDAL时为什么必须包含头文件:gdal_priv.h?gdal_priv.h...
使用GDAL肯定要调用gdal定义的库函数,gdal_priv.h里面有GDAL相关库函数的声明,所以要使用GDAL里面的库函数,就要包含gdal_priv.h头文件

c++问题,如果我对头文件进行多次包含会因为名字重复而出错吗?_百度知 ...
会的,不过也看编译器,有的IDE会自助替换再编译 VS中则不行,比如下继承中;class A B:A 若C同时使用A B对象,则只用包含B的头文件即可

相似回答