首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

再问,头文件包含有关问题

2013-04-20 
再问,头文件包含问题C和C++对于 头文件包含,解释有没有不一样?a.h/a.cpp,这样一个文件组a.h中定义类成员函

再问,头文件包含问题
C和C++对于 头文件包含,解释有没有不一样?

a.h/a.cpp,这样一个文件组

a.h中定义类成员函数

class A{
public:
void something(dirent* ent);
}


a.cpp中
#include <dirent.h>
#include "a.h"
void A::something(dirent* ent)
{

}


以前一直理解,包含头文件,就是在编译的时候把头文件中的内容放到.cpp中,一起编译.那么,a.cpp中的include a.h的内容就被替换成a.h文件中的东西.

那么#include <dirent.h>是在include a.h上面的,所以,a.h里也能识别dirent这个类型.但今天碰到的情况是,a.h中不加#include <dirent.h>,就报识别不了dirent这个类型的错.<dirent.h>这是个linux系统头文件.


而同样的情况,include <string> 却可以,在a.cpp中使用,就include,在a.h中不include,即使包含了有使用string的函数参数也没事.

这几天C、C++不断的试,发现,有时候.h文件里不包含#include <dirent.h>(这样的头文件)可以,有时候不可以.真心不明白为什么啊,求大神解惑
[解决办法]
这么简单的问题,唉

因为dirent是个结构体,而string是个类,而dirent是以C的方式声明的,必须要
struct dirent ent;来声明,要么就include头文件
[解决办法]
基本原理是没有错的, c++ 你不可能出现使用类型在声明类型之前还可以通过编译的情况. 当然, 你使用的是类型的引用或指针时, 只需要类型的前置声明, 没有完整定义也可以. 你把你说的使用在声明之前, 可以通过编译的完整源代码发出来看看?
[解决办法]
1.首先你要弄清楚的是,一般情况下,在VS环境中,只有.c,.cpp文件才会被编译,.h文件如果没有任何.c/cpp包含它,那么即使它是错的,编译器也不会管它。

2.#include是预处理指令,在编译之前执行,目标是把后面的文件内容插入到当前位置。你在脑袋中想象一下插入后是个什么情况,然后再编译会不会出现“使用变量在定义变量之前”的情况。

3.h文件和c/cpp文件分离,其中的一个原因是h文件是提供给多方面使用的,因此,我不赞成在h文件中用到的东西,放在cpp文件中去定义(或者包含),这样很可能会出现莫名其妙的未定义错误。所以,.h文件用到了什么东西,就要在里面进行相应的定义(或者包含)(全局变量或函数除外,.h中全局的东西一般都要加extern修饰),一般情况下不用担心重复包含的问题。

热点排行