c++头
头文件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++头的更多相关文章
- HTTP1.1协议-RFC2616-中文版课前资料收集
1.http rfc大致讲了什么? 2.解决了什么问题? HTTP协议描述的是发送方与接收方的通信协议 协议功能: HTTP协议(HyperText Transfer Protocol,超文本传输协议 ...
- HTTP1.1协议-RFC2616-中文版
转自:http://www.cnblogs.com/k1988/archive/2010/01/12/2165683.html 说明 本文档规定了互联网社区的标准组协议,并需要讨论和建议以便更加完善. ...
- IIS启动失败,启动Windows Process Activation Service时,出现错误13:数据无效 ;HTTP 错误 401.2 - Unauthorized 由于身份验证头无效,您无权查看此页
因为修改过管理员账号的密码后重启服务器导致IIS无法启动,出现已下异常 1.解决:"启动Windows Process Activation Service时,出现错误13:数据无效&quo ...
- 【WCF】自定义地址头的筛选器
前面的文章中,老周已向大伙伴们介绍了如何在终结点上使用地址头,只要服务是沿着该终结点调用的,那么每一次调用都会自动把地址头插入到SOAP消息的Header列表中. 而通过前一篇文章中的示例,大家也看到 ...
- 【WCF】为终结点地址应用地址头
记得不久前,老周写过博文,探讨过在ContextScope以一定的范内向发出的消息中插入消息头,scope只能为特定的某一次服务操作的调用而添加SOAP头,要是需要在每次调用操作协定的时候都插上Hea ...
- C# listview 单击列头实现排序 <二>
单击列头实现排序,首先在羡慕中添加下面的帮助实现的类:具体的代码: using System; using System.Collections; using System.Windows.Forms ...
- 仿喜马拉雅实现ListView添加头布局和脚布局
ListView添加头布局和脚布局 之前学习喜马拉雅的时候做的一个小Demo,贴出来,供大家学习参考: 如果我们当前的页面有多个接口.多种布局的话,我们一般的选择无非就是1.多布局:2.各种复杂滑动 ...
- 【转】你所不知道的HTML <head/> 头标签
HTML的头部内容特别多,有针对SEO的头部信息,也有针对移动设备的头部信息.而且各个浏览器内核以及各个国内浏览器厂商都有些自己的标签元素,有很多差异性.移动端的工作已经越来越成为前端工作的重要内容, ...
- 【C】.h头文件的重复包含问题
.h头文件存在的意义就是封装,可以方便多个.c源文件使用,但要防止.h头文件被同一个.c源文件多次包含. 例如, io.h文件 #ifndef _IO_H_ #define _IO_H_ #defin ...
- CMakeList.txt/Clion中添加头文件和库
cmake_minimum_required(VERSION 3.6) project(capi_lua) include_directories(/usr/include) find_library ...
随机推荐
- 使用和制作patch文件
使用和制作patch文件 发表时间: 2007-2-13 20:57 作者: superuser 来源: 迷茫人 字体: 小 中 大 | 打印 原文http://www.linuxsir. ...
- FOJ 1591 —— Coral的烦恼
#include<stdio.h> int main() { __int64 n,i,sum,l,r; while(scanf("%I64d",&n)!=EOF ...
- 伤不起的戴尔台式机XPS8700脆弱的蓝牙
http://en.community.dell.com/support-forums/desktop/f/3514/t/19520747.aspx 1.报价仅仅包含主机,并且不带音响(speaker ...
- windows 2003 自动安全设置
@echo offecho.echo.echo.echo 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓echo.echo.echo windows 2003 自动安全设置程序 echo. ec ...
- pan
百度云盘地址第一季http://pan.baidu.com/share/link?shareid=198342&uk=1191518428第二季http://pan.baidu.com/sha ...
- SESC中的热量模拟器
SESC安装见前文 配置sesc支持热量模拟 ../sesc/configure --enable-power --enable-therm make 遇到问题: 1 找不到 liblevmar.a ...
- 腾讯视频QLV格式转换mp4的方法
腾讯视频QLV格式转换mp4的方法不知道大家知不知道用?喜欢用腾讯视频的朋友应该都知道腾讯视频单独搞出了个QLV格式文件,只能用腾讯独有的腾讯视频软件才能播放,就算用格式工厂转换也不行,那么腾讯视频的 ...
- java设计模式_单例
public class Singleton { public static void main(String[] args) throws Exception { System.out.printl ...
- nginx学习12 ngx_cycle_t 和 ngx_init_cycle
在nginx在启动过程,ngx_init_cycle这个函数最初始工作.变量的初始化存储在ngx_cycle_t这个结构体中,为了深入了解这个函数都做了那些初始化工作,就化时间研究了一下.并写下来以便 ...
- cocos2dx A* + tiledMap
本文转自:http://blog.csdn.net/w18767104183/article/category/1757765 前面一章讲了cocos2dx 中使用A星算法 这章中讲 A*结合tile ...