【C++】C++中的头文件(.h)—详解(2)

接上。。。

fishing-panhttps://blog.csdn.net/u013921430转载请注明出处】

头文件中写些什么

       在上篇博客中写到头文件本身不参与编译,但是它们被包含到源文件中,那么头文件里面应该写一下什么呢?

       根据“单一定义”原则,我们可以很明显的知道,头文件不应该放对象的定义,只能写对象的声明。如果写有对象的定义,相当于在所有包含该头文件的源文件中都对其进行了定义,这是不合法的。

       因此,下面的这些内容应该放在头文件中:函数原型声明、全局变量声明、自己定义的宏和类型等。

      下面这些内容不应该放在头文件中:全局变量的定义、外部变量的定义、静态变量和静态函数的的定义、在类体之外的类成员函数的定义等。头文件应该包含和不应该包含什么内容,都是为了满足头文件被多个源文件包含而不引发编译错误。

        但是有三个例外是可以写在头文件中的;

头文件中可以写const对象的定义

       因为全局的const对象默认只在当前文件中有效,把const对象写进头文件中,即使它被包含到其他多个.cpp文件中,这个对象也都只在包含它的文件中有效,对其他文件来说是不可见的,所以便不会导致多重定义。同理,static对象的定义也可以放进头文件。

 

头文件中可以写内联函数(inline)的定义

       inline函数是需要编译器在遇到它的地方根据它的定义把它内联展开的,而并非是普通函数那样可以先声明再链接的,内联函数并不会参与链接,所以编译器就需要在编译时看到内联函数的完整定义才行。C++规定,内联函数可以在程序中定义多次,只要内联函数的定义在一个.cpp文件中只出现一次,并且在所有的.cpp文件中,这个内联函数的定义是一样的,就能通过编译。那么把内联函数的定义放进一个头文件中就能满足以上的要求,何乐不为呢。

 

头文件中可以写类 (class)的定义

      在程序中创建一个类的对象时,编译器只有在这个类的定义完全可见的情况下,才能知道这个类的对象应该如何布局,所以,关于类的定义的要求,跟内联函数是基本一样的。所以把类的定义放进头文件,在使用到这个类的.cpp文件中去包含这个头文件,是一个很好的做法。类的定义中包含着数据成员和成员函数。数据成员是要等到具体的对象被创建时才会被定义,被分配空间,但函数成员却是需要在一开始就被定义的。

       我们可以直接把函数成员的实现代码也写进类定义中。在C++的中,如果函数成员在类的定义体中被定义,那么编译器会视这个函数为内联的。因此是合法的。注意一下,如果把函数成员的定义写在类定义的头文件中,而没有写进类定义范围内,这是非法的,因为这个函数成员此时就不是内联的了,如果该头文件被两个及以上的.cpp文件同时包含,这个函数成员就被重定义了。

 

头文件的使用

       在《C++中头文件的使用》中已经讲过了关于头文件的使用规则,这里再简单的讲一下。

       如果头文件中只有对象的声明,那么他被引用多少次都可以。但是有时候头文件会被隐含的包含多次,而在头文件中你使用了上述三种情况中的任意一种情况。例如

       在CB.h中定义了一个

const int F=10;

      CA.h中包含了CB.h,在main.cpp中同时包含了CA.h与CB.h。那么相当于CB.h被包含main.cpp了两次,那么在进行预编译时,就定义了两个F,这是不合法的。

或者很多人喜欢在头文件中写这样的语句:

int a;

其实这是定义,因为编译器会默认初始化为0;

这写时候都会出现重复定义的错误。

大家可以使用

使用 #ifndef,#define, #endif或者使用#pragma once

详细的使用方法可以参考《C++中头文件的使用》

完。。

相关链接。。《C++中头文件的使用》 、C++中的头文件(.h)—详解(1)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值