设计自己的头文件

头文件一般包含1、类的定义,2、extern变量的声明, 3、函数的声明;

规则1: 头文件是用于声明的,而不是用于定义;

下面语句不应该出现在头文件中:

  extern int val = 10;  //虽然加了extern关键字,但这仍是一个定义,因为对val进行了初始化赋值;

  double fica_rate;    //这也是一个定义:定义了一个double型变量fica_rate, 为fica_rate分配了内存空间;

正确写法:

   extern doublefica_rate;

  extern int function1();

规则2:类的定义、值在编译时已知道的const对象、inline函数 最好写在头文件中;

#解析:

c++中任何变量都只能定义一次,定义会分配存储空间,而所有对该变量的使用都关联到同一存储空间。但头文件可能会被包含在多个源文件中,同一个程序中有两个以上文件含有规则1中的例子的定义,就会导致多重定义链接错误

为什么规则2中的所述的变量可以写在头文件中?

因为编译器需要知道这些尸体的定义(不只是声明)来产生代码。

对于类定义:编译器需要知道类该类的数据成员,和能够在这些对象上执行的操作;

对于const对象: const对象默认是定义该对象的局部变量。所以把它们放在头文件是合法的。在头文件中定义了const变量后,每个包含该头文件的源文件都有自己的const变量,其名称和值都一样,但存储空间不一样。 如果const变量不是已知的(不是用常量表达式初始化的),它就不应该定义在头文件中。

规则3:避免头文件被多重包含

因为头文件经常会包含其他头文件。例如,定义类A的头文件(假如是A.h)需要包含string.h(A类含有一个string类型数据成员,因此必须可以访问string头文件),而一个程序需要使用A类包含了A.h,这个程序同时也需要使用string库包含了string.h, 该程序不知道A.h已经包含了string.h, 这时string头文件就被包含了两次;

为避免多次包含同一头文件,应该在头文件中加入 预处理器变量

#ifndef   SALESITE_H

#define  SALESITE_H

// 在此添加头文件中定义

#endif

时间: 2024-11-04 19:24:21

设计自己的头文件的相关文章

C++中头文件设计

对于小工具程序而言,用C++编写估计也就几个文件,此时很少设计头文件互相包含引发的编译出错问题.但是当软件功能越来越多,功能越来越复杂,各模块之间的调用关系也越来越不明显,此时很有可能会出现A头文件包含B头文件,B头文件包含A头文件的情况,这种互相包含头文件会导致出现找不到编译类型的错误.最简单的代码如下:A.h如下 #include "B.h" class A { B b; } A.cpp如下 #include "A.h" class A { ... } B.h如

Facebook App 的头文件会有更多的收获

最近在看一些 App 架构相关的文章,也看了 Facebook 分享的两个不同时期的架构(2013 和 2014),于是就想一窥 Facebook App 的头文件,看看会不会有更多的收获,确实有,还不少.由于在选择 ipa 上的失误,下了个 7.0 版的 Facebook(最新的是 18.1),会稍有过时,不过后来又下了个 18.1 的看了下,发现变动其实不大.以下是我从头文件中获取到的一些信息(20多万行,浏览起来还是挺累的) 让视图组件可以方便地配置 这个在 Facebook 的演讲中也提

c++ 头文件包含问题-include&class

http://blog.csdn.net/jiajia4336/article/details/8996254 前向声明概念(forward declaration) 在程序中引入了类类型的B.在声明之后,定义之前,类B是一个不完全类型(incompete type),即已知B是一个类型,但不知道包含哪些成员.不完全类型只能以有限方式使用,不能定义该类型的对象,不完全类型只能用于定义指向该类型的指针及引用,或者用于声明(而不是定义)使用该类型作为形参类型或返回类型的函数. 前向声明应用场景 当你

PCI/PCIe接口卡Windows驱动程序(3)- 驱动程序代码(头文件)

在WDF的PCIe驱动程序中,共有四个.h文件(Public.h  Driver.h  Device.h  Trace.h).本文将分别对四个文件源代码进行详细的解释. Public.h 1 #ifndef _USER_H 2 #define _USER_H 3 // 4 // Define an Interface Guid so that app can find the device and talk to it. 5 // 6 #include <initguid.h> 7 // {4

编写一个可变参数的C函数——头文件stdarg.h中宏va_start ,va_arg和va_end的应用

我们在C语言编程中会遇到一些参数个数可变的函数,例如printf()这个函数,它的定义是这样的:int printf( const char* format, ...);它除了有一个参数format固定以外,后面跟的参数的个数和类型是可变的,例如我们可以有以下不同的调用方法:printf("%d",i);printf("%s",s);printf("the number is %d ,string is:%s", i, s);究竟如何写可变参数的

前置声明和头文件

假设有一个Date类 Date.h class Date {   private:       int year, month, day;   };   如果有个Task类的定义要用到Date类,有两种写法 其一 Task1.h class Date;   class Task1 {   public:       Date getData();   };   其二 Task2.h #include "Date.h"   class Task2 {   public:       Da

C++的头文件和实现文件分别写什么

在C++编程过程中,随着项目的越来越大,代码也会越来越多,并且难以管理和分析.于是,在C++中就要分出了头(.h)文件和实现(.cpp)文件,并且也有了Package的概念. 对于以C起步,C#作为"母语"的我刚开始跟着导师学习C++对这方面还是感到很模糊.虽然我可以以C的知识面对C++的语法规范,用C#的思想领悟C++中类的使用.但是C#中定义和实现是都在一个文件中(其实都是在类里面),而使用C的时候也只是编程的刚刚起步,所写的程序也只要一个文件就够了.因此对于C++的Package

[转]C/C++关于string.h头文件和string类

学习C语言时,用字符串的函数例如stpcpy().strcat().strcmp()等,要包含头文件string.h 学习C++后,C++有字符串的标准类string,string类也有很多方法,用string类时要用到string.h头文件. 我现在看vc的书上也有CString类,这个要包含什么,怎么用? 我现在很迷惑,这两个 string.h有什么区别.是怎么回事 且看一: 这两个一个是标准C库的,定义了一些字符串的处理函数.一个是标准C++库的,定义了标准C++的std::string类

C程序中头文件相互包含精华(转载)

C程序中头文件相互包含精华(网摘小结) 收藏(转自:http://blog.csdn.net/lingyun3429/archive/2010/04/27/5535191.aspx).h中一般放的是同名.c文件中定义的变量.数组.函数的声明,需要让.c外部使用的声明. 1)h文件作用 1 方便开发:包含一些文件需要的共同的常量,结构,类型定义,函数,变量申明: 2 提供接口:对一个软件包来说可以提供一个给外界的接口(例如: stdio.h). 2)h文件里应该有什么 常量,结构,类型定义,函数,