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 ...
随机推荐
- Keil - 编译错误总结 01
Keil 编译 STM32project,出现下述错误. 并且. Options for Target -> Output - Browse Information 选项无法勾选. ...
- RSD和wlwmanifest是什么
今天小博发现header.php文件里<?php wp_head(); ?>显示有以下的两句代码,因为小博的网站打开速度实在太慢了,换空间怕麻烦,那就只有优化代码了. <link r ...
- 在C#或者SWT上跨进程访问SWT控件的问题
可能为了进程安全,无论是C#的Form还是Eclipse的SWT,都不允许跨进程访问控件. 通俗一点说就是: A进程创建了控件Widget,若想在B进程中访问控件Widget就会报错,必须在创建Wid ...
- hdu1881(贪心+dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1881 分析:按照结束时间从小到大排序,然后以每个结束点为容量进行01背包,选入的必定符合条件的. 因为 ...
- CrossBridge介绍
CrossBridge介绍 作者:chszs,转载需注明.博客主页: http://blog.csdn.net/chszs CrossBridge是Adobe FlasCC的开源版本,它提供了一个完整 ...
- leetcode -day19 Convert Sorted List to Binary Search Tree
1. Convert Sorted List to Binary Search Tree Given a singly linked list where elements are sorted ...
- ArcGIS For Flex给定两个
1.错误叙述性说明 2.错误原因 3.解决方案 版权声明:本文博客原创文章,博客,未经同意,不得转载.
- malloc一次性最大能申请多大内存空间
受用户态内存地址空间的限制.64 位系统下分配几个 T 不成问题. 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:zz matrix链接:http://www.zhihu. ...
- linux su,sudo命令
linux su 命令 建议大家切换用户的时候 使用 su - root 这样,否则可能发现某些命令执行不了 关于su .su - 及 sudo的区别 请往下看 1.命令作用 su的作用是变更为其它使 ...
- HDU5015 233 Matrix(矩阵高速幂)
HDU5015 233 Matrix(矩阵高速幂) 题目链接 题目大意: 给出n∗m矩阵,给出第一行a01, a02, a03 ...a0m (各自是233, 2333, 23333...), 再给定 ...