头文件c/c++独特的概念。

首先解释声明和定义的区别。

extern int x;这是一个可变x声明,void fun();这是函数fun()声明。class a;这是类a声明。

int x;变量x定义。void fun(){};则为fun()函数的定义,class a{};则为类a的定义。

头文件里存放预处理命令(#开头的命令),函数声明。类、结构体、联合定义(不能实例化对象),模板定义等。

而不应该包括变量定义。函数定义等。头文件里的内容不会去生成目标代码。不会去为变量声明或类定义分配内存空间,都仅仅是一些声明性的东西。#include在编译的预编译阶段展开用对应的头文件内容替换。

编译单元是指一个cpp文件。能够生成一个目标文件。同一个编译单元中能够有反复的声明,可是不同意反复的变量定义、函数定义、类定义。不同的编译单元能够有反复的声明和类定义(这里比較特殊,由于类定义仅仅是声明性的东西,没有实际产生目标代码,故能够放在不同的编译单元中,而在同一编译单元中不能反复定义),不同意反复的变量定义和函数定义。

为了防止在同一个编译单元中头文件反复引用导致出现类反复定义等问题,在每一个头文件定义时增加#ifndef  #define #endif的定义。

而且该条件编译指令也能够避免头文件的循引用,在程序预编译阶段,碰到#include命令即展开相应的头文件。在展开那个头文件时同理处理。

比方有三个头文件a.h b.h c.h,a.h里面有#include "b.h",b.h里面有#include "c.h", c.h里面有#include "a.h",这就会造成文件的循环依赖,此时若有个文件a.c。当中#include
"a.h"。那在a.c文件编译之前,预处理程序就会不断的把这三个头文件的内容复制过来。超过了一定的数量,就会导致“头文件数太多”的编译错误。当使用#ifndef...#define...#endif条件编译命令后,第一次展开a.h b.h c.h的时候就已经定义了宏,到了c.h中的#include "a.h"时候,遇到了#ifndef。因为这个宏在上一次展开时已经定义了,所以这部分就跳过去了。也就是每一个头文件最多仅仅在每一个源文件中面包括一次。

以下解决一个实际问题即两个类A,B中都有还有一个类的指针。即彼此互相引用。这里能够用前置声明来解决。

头文件a.h

#ifndef A_H
#define A_H
class B;
class A
{
public:
B* b;
};
#endif

头文件b.h

#ifndef B_H
#define B_H
class A;
class B
{
public:
A* a;
};
#endif

使用头文件时的两个原则:

1、假设能够不包括头文件,那就不要包括了。这时候前置声明能够解决这个问题。假设使用的不过一个类的指针,没有使用这个类的详细对象(非指针),也没有訪问到类的详细成员。那么前置声明就能够了。

由于指针这一数据类型的大小是特定的。编译器能够获知。

2、尽量在CPP文件里包括头文件,而非在头文件里。如果类A的一个成员是是一个指向类B的指针,在类A的头文件里使用了类B的前置声明并 廉价成功。那么在A的实现中我们须要訪问B的详细成员,因此须要包括头文件。那么我们应该在类A的实现部分(CPP文件)包括类B的头文件而不是声明节

版权声明:本文博客原创文章,博客,未经同意,不得转载。

c++头的更多相关文章

  1. HTTP1.1协议-RFC2616-中文版课前资料收集

    1.http rfc大致讲了什么? 2.解决了什么问题? HTTP协议描述的是发送方与接收方的通信协议 协议功能: HTTP协议(HyperText Transfer Protocol,超文本传输协议 ...

  2. HTTP1.1协议-RFC2616-中文版

    转自:http://www.cnblogs.com/k1988/archive/2010/01/12/2165683.html 说明 本文档规定了互联网社区的标准组协议,并需要讨论和建议以便更加完善. ...

  3. IIS启动失败,启动Windows Process Activation Service时,出现错误13:数据无效 ;HTTP 错误 401.2 - Unauthorized 由于身份验证头无效,您无权查看此页

    因为修改过管理员账号的密码后重启服务器导致IIS无法启动,出现已下异常 1.解决:"启动Windows Process Activation Service时,出现错误13:数据无效&quo ...

  4. 【WCF】自定义地址头的筛选器

    前面的文章中,老周已向大伙伴们介绍了如何在终结点上使用地址头,只要服务是沿着该终结点调用的,那么每一次调用都会自动把地址头插入到SOAP消息的Header列表中. 而通过前一篇文章中的示例,大家也看到 ...

  5. 【WCF】为终结点地址应用地址头

    记得不久前,老周写过博文,探讨过在ContextScope以一定的范内向发出的消息中插入消息头,scope只能为特定的某一次服务操作的调用而添加SOAP头,要是需要在每次调用操作协定的时候都插上Hea ...

  6. C# listview 单击列头实现排序 <二>

    单击列头实现排序,首先在羡慕中添加下面的帮助实现的类:具体的代码: using System; using System.Collections; using System.Windows.Forms ...

  7. 仿喜马拉雅实现ListView添加头布局和脚布局

     ListView添加头布局和脚布局 之前学习喜马拉雅的时候做的一个小Demo,贴出来,供大家学习参考: 如果我们当前的页面有多个接口.多种布局的话,我们一般的选择无非就是1.多布局:2.各种复杂滑动 ...

  8. 【转】你所不知道的HTML <head/> 头标签

    HTML的头部内容特别多,有针对SEO的头部信息,也有针对移动设备的头部信息.而且各个浏览器内核以及各个国内浏览器厂商都有些自己的标签元素,有很多差异性.移动端的工作已经越来越成为前端工作的重要内容, ...

  9. 【C】.h头文件的重复包含问题

    .h头文件存在的意义就是封装,可以方便多个.c源文件使用,但要防止.h头文件被同一个.c源文件多次包含. 例如, io.h文件 #ifndef _IO_H_ #define _IO_H_ #defin ...

  10. CMakeList.txt/Clion中添加头文件和库

    cmake_minimum_required(VERSION 3.6) project(capi_lua) include_directories(/usr/include) find_library ...

随机推荐

  1. Java NIO的性能

    最近调研了一下mina和netty框架的性能,主要是想了解java nio在单机能支持多少长连接. 首先,mina的qq群有同学反映说单机支持3w长连接是没问题的 其次,http://amix.dk/ ...

  2. WindowsclientC/C++编程规范“建议”——前言

    前言 工作中接触了非常多编程规范.当中最有意思的是,公司近期公布了一版C/C++编程规范,然后我看到该规范的最后一段时,有这么一句:"该规范不适用于Windows平台开发".看来这 ...

  3. DOM中的动态NodeList与静态NodeList

    GitHub版本号: https://github.com/cncounter/translation/blob/master/tiemao_2014/NodeList/NodeList.md 副标题 ...

  4. (转)在 Visual Studio 2010 中创建 ASP.Net Web Service

    很多人在论坛里说,在Visual Studio 2010中不能创建“ASP.Net Web Service”这种project了,下面跟帖者云云,有的说这是因为微软已经将Web Service整合进W ...

  5. 提供一个好用的Oracle Database 11g 下载地址

    提供一个好用的Oracle Database 11g 下载地址,在windows xp 操作系统下,测试通过. http://download.oracle.com/otn/nt/oracle11g/ ...

  6. HTML中的div标签

    在网页制作过程过中,能够把一些独立的逻辑部分划分出来.放在一个<div>标签中,这个<div>标签的作用就相当于一个容器. 为了使逻辑更加清晰,我们能够为这一个独立的逻辑部分设 ...

  7. poj 3172 Scales 搜索

    其实这个题目要是注意到了题目的一点关键性的描述就会变得很简单,题意是给出的砝码是至少是前两个的和的,有了这一点,那么砝码的数量应该就在几十左右,这样的话适当剪枝的搜索是应该可以过的. #include ...

  8. 初识Mongodb之[CURD]-PHP版

    行动 在了实践之前,希望大家看一下上面的学习资源,了解一下基本操作. 数据连接初始账号password 账号:admin password:admin 首先我们建立一个文件:mongodb.php,设 ...

  9. LeetCode: Best Time to Buy and Sell Stock III [123]

    [称号] Say you have an array for which the ith element is the price of a given stock on day i. Design ...

  10. Wind River Linux 6 Security Profile

    2692407267@qq.com,很多其它内容请关注http://user.qzone.qq.com/2692407267 Wind River Linux 6 Security Profile