编程技术是改变世界的力量。
本站
当前位置:网站首页 > 后端语言 > 正文

C++中的头文件(.h)(c++头文件.h需不需要)

gowuye 2024-04-25 04:47 6 浏览 0 评论

1.定义

头文件是扩展名为 .h 的文件,头文件也是C++的源代码,头文件中包含了 C++中函数、类、对象等的声明和宏定义,它可以被多个源文件通过#include引用共享。

2.使用头文件原因

C++中有“单一定义”规则,即一个对象只能被定义一次,如果在一个源文件中定义了一个函数,其他的源文件想要使用这个函数就需要在使用前声明一下这个函数,在编译结束之后,编译器链接的时候再去查找这些函数的定义。
故要使用其他文件中定义的函数、类、对象(变量)时,需要对函数、类、对象进行声明。这些声明文件一般放在一个头文件中,这样只要通过#include就可以一下引入所有的声明。当然也可以在头文件中定义宏。
自定义的头文件,使用#include”头文件.h”。对于标准库头文件的包含使用#include<头文件.h>

3.编译过程中的头文件

C++代码的编译主要通过以下几个过程:预编译->编译->汇编->链接【可参考:链接(建议先看此链接,再看下面内容)】,最后生成可执行文件。
在预编译阶段,编译器将#include”头文件.h”替换成“头文件.h”中具体的声明内容。
在链接阶段,编译器查找声明对象的定义。

3.1.预编译阶段,头文件被替换

我们看一个简单的例子,下面是一个头文件CA.h

#ifndef CA_H
#define CA_H

int Fun();
#endif

头文件中的函数、类、对象(变量)必须在一个源文件有进行定义,这里在A.cpp中进行定义。
A.cpp:

#include "CA.h"
int Fun()
{
    return 1;
}

B.cpp中引用头文件:

#include "CA.h"

int Fun1()
{
    return Fun() + 1;
}

int main(){
    return Fun1();
}

预编译命令:

g++ -E B.cpp -o B.i

经过预处理后, B.i:

# 1 "B.cpp"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "B.cpp"
# 1 "CA.h" 1



int Fun();
# 2 "B.cpp" 2

int Fun1()
{
 return Fun() + 1;
}

int main(){
 return Fun1();
}

可以看到,B.cpp中的头文件#include “CA.h”都被CA.h中的具体内容所代替。
【注】“#”是注释

3.2.使用头文件
g++ A.cpp B.cpp -o main
B.cpp中通过头文件引入的东西,会在A.cpp中自动找到。

4.如何写头文件

在写头文件时需要注意,在开头和结尾处必须按照如下样式加上预编译语句(如下)
Circle.h:

#ifndef CIRCLE_H
#define CIRCLE_H

 // 你的代码写在这里

#endif

#ifndef代表没有定义CIRCLE_H时,才能进入if。进入if之后,第一步就是执行#define CIRCLE_H来定义CIRCLE_H。这样做以后,即使重复引入头文件,也不会重复执行if中的东西。
至于CIRCLE_H这个名字实际上是无所谓的,你叫什么都行,只要符合规范都行。原则上来说,非常建议把它写成这种形式,因为比较容易和头文件的名字对应。
下面举个最简单的例子来描述一下,咱就求个圆面积。
第1步,建立一个空工程(以在VS2003环境下为例)。
第2步,在头文件的文件夹里新建一个名为Circle.h的头文件,它的内容如下:

 #ifndef CIRCLE_H
 #define  CIRCLE_H

 class  Circle
 {
private:
    double r;//半径
public:
    Circle();//构造函数
    Circle(double R);//构造函数
    double Area();//求面积函数
} ;

 #endif

在头文件里,并不写出函数的具体实现。
第3步,要给出Circle类的具体实现,因此,在源文件夹里新建一个Circle.cpp的文件,它的内容如下:

#include  " Circle.h "

Circle::Circle()
 {
    this->r=5.0;
}

Circle::Circle( double  R)
 {
    this->r=R;
}

 double  Circle:: Area()
 {
    return 3.14*r*r;
}

一般实现Circle.h的cpp文件取名为Circle.cpp
最后,我们建一个main.cpp来测试我们写的Circle类,它的内容如下:

#include  < iostream >
#include  " Circle.h "
 using   namespace  std;

 int  main()
 {
    Circle c(3);
    cout<<"Area="<<c.Area()<<endl;
    return 1;
}

运行命令:

g++ Circle.cpp main.cpp -o main
./main

5.C++头文件有.h和没有.h

iostream.h是非标准头文件,iostream是标准头文件形式。iostream.h时代没有名词空间,即所有库函数包括头文件iostream.h都声明在全局域。为了体现结构层次,c++标准委员会引入了名词空间这一概念,并把所有库函数声明由全局域改到了名词空间std。iostream.h里面定义的所有类以及对象都是在全局空间里,所以可以直接使用cout,但如果你用iostream,就不能直接使用cout了,iostream里面所定义的东西都在标准命名空间std里面,所以你必须加上 using namespace std才能使用cout。
故而,
在早些时候,这两种头文件是等价:

#include<iostream.h> // 这个现在已经不支持了

#include
using namespace std;
现在标准的C++头文件没有.h扩展名,将以前的C的头文件转化为C++的头文件后,可以加上c的前缀表示来自于c,例如cmath就是由math,h变来。
注意:c语言的string.h变为cstring,和c++的string是两个完全不同的东西。

6.后缀为.hpp的文件

后缀为.hpp的文件一般提供程序使用的接口。

我们公司和另一家软件公司合作,这样就必然要互相提供一些软件的信息(比如一些类,它到底是要做什么的),可是在提供这些信息的同时我们又不像让对方知道我们这些类的具体实现,毕竟这些是我们公司的算法核心和心血啊。所以这个时候就可以把类的接口(这个类是要做什么的)放在*.hpp文件中,而具体类的实现放在 .cpp文件。这时候我们只要给对方公司.hpp文件就行了。这样既提供了必要的信息,又保护了我们的核心代码。

相关推荐

Nginx 响应提速10倍,你需要知道的缓存性能优化——FastCGI调优
Nginx 响应提速10倍,你需要知道的缓存性能优化——FastCGI调优

Nginx缓存优化是帮助大家提升网站性能的重要操作之一,proxy_cache主要用于反向代理时,对后端内容源服务器进行缓存;fastcgi_cache主要用于...

2024-05-20 14:44 gowuye

王者荣耀天魔缭乱和逐梦之音返场活动地址 3月22日开启返场活动
王者荣耀天魔缭乱和逐梦之音返场活动地址 3月22日开启返场活动

王者荣耀官方终于确定了天魔缭乱和逐梦之音的返场活动,这让不少小伙伴乐开了花,返场活动将会在3月22日开启,下面就带来王者荣耀天魔缭乱和逐梦之音返场活动地址!王者...

2024-05-20 14:44 gowuye

常见的嵌入式web服务器有哪些?

嵌入式WEB服务器常见的有:Lighttpd,Shttpd,Thttpd,Boa,Mini_httpd,Appweb,Goahead。Lighttpd地址:http://www.light...

简述几款常见的嵌入式web服务器
简述几款常见的嵌入式web服务器

嵌入式web服务器,是web服务器当中的一种,是基于嵌入式系统而实现的web服务器。指的是在嵌入式系统(通俗点就是单片机系统)上实现的一个web服务器,可以通过...

2024-05-20 14:44 gowuye

教你如何利用fastcgi_cache缓存加速WordPress

在使用nginx缓存之前,必须在nginx里面加载专门的模块,这个模块叫做ngx_cache_purge。添加ngx_cache_purge模块下载ngx_cache_purge模块ngx_cache...

扫描WordPress漏洞

检测已知漏洞WPScan是一款广泛使用的WordPress安全扫描工具,它的一项重要功能是检测已知漏洞。在这篇文章中,我们将深入探讨WPScan如何检测已知漏洞,并结合实际示例,帮助读者更好地理解和应...

消灭 Bug!推荐几个给力的开源 Bug 跟踪工具
消灭 Bug!推荐几个给力的开源 Bug 跟踪工具

在这个充满bug的世界里,最遥远的距离不是生与死,而是你亲手制造的bug就在你眼前,你却怎么都找不到它。因此本文准备了7款优秀的开源bug跟踪系...

2024-05-20 14:43 gowuye

生物信息分析入门全攻略

生物信息学是生命科学研究的重大前沿领域,未来将占据生命科学研究的半壁江山。已经有越来越多的小伙伴投入到生物信息的学习中,但是入门难、深入慢、摸不到方向等都成为持续学习的拦路虎。本文根据生物信息技术大牛...

elkb实践经验,再赠送一套复杂的配置文件
elkb实践经验,再赠送一套复杂的配置文件

原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。宝剑锋从磨砺出,梅花香自苦寒来。诗人白居易,三月下江南,看到沿路开放的桃花,心潮澎湃...

2024-05-20 14:43 gowuye

超详细从0到1 搭建ELK监控
超详细从0到1 搭建ELK监控

监控分类?Metrics用于记录可聚合的数据。例如,1、队列的当前深度可被定义为一个度量值,在元素入队或出队时被更新;HTTP请求个数可被定义为一个计数器,...

2024-05-20 14:42 gowuye

嵌入式开发 之Web配置页面开发
嵌入式开发 之Web配置页面开发

1.PHP是最好的语言??开发动态页面首选的语言是PHP,村村不能在这里忽悠人,如果你的硬件性能允许切略懂PHP,看到这里就可以退出了。本文面向的受众是Linu...

2024-05-20 14:42 gowuye

Python开发一个网站目录扫描工具用来检测网站是否有漏洞?
Python开发一个网站目录扫描工具用来检测网站是否有漏洞?

开发一个网站目录扫描工具是用来检测网站是否有非法目录请求的一个常见需求之一,我们要通过这个扫描工具来找到通过某个域名可以访问到的网站路径,可能对于有些系统来讲,...

2024-05-20 14:42 gowuye

创建一个类似Youtube的Id——使用PHP/Python/JS/Java/SQL

id通常都是用数字,不巧的是只有10个数字来使用,所以如果你有很多的记录,id往往变得非常冗长。当然对于计算机来说无所谓,但我们更希望id尽可能短。所以我们如何能使id变短?我们可以利用字母让它们附加...

快速云:有助于移动应用安全开发的五条妙计
快速云:有助于移动应用安全开发的五条妙计

许多企业不断地向其开发团队提供培训。但是某些漏洞,如早在十多年前就发现的SQL注入,如今仍广泛存在于各种应用中。因而,安全培训永不过时。在开发移动应用时,开发者...

2024-05-20 14:41 gowuye

洛杉矶国际电影节最佳动画短片奖影片《G’DAY》正式全网上映
洛杉矶国际电影节最佳动画短片奖影片《G’DAY》正式全网上映

7月2日,由M&CSaatchi创作,由深受好评的澳大利亚导演迈克尔·格雷西执导的动画短片《G’day》,正式在全网上映。该影片因其出色的创意赢得了洛...

2024-05-20 14:41 gowuye

取消回复欢迎 发表评论: