• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C++中头文件的概念与基本编写方法

C++中头文件的概念与基本编写方法

作者:ywbab 字体:[增加 减小] 来源:互联网 时间:2017-05-28

ywbab 通过本文主要向大家介绍了c++头文件,c++头文件怎么写,c++头文件大全,c++头文件和源文件,c++头文件格式等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

1 标准库中的头文件
C++标准库中的一切内容都被放在名字空间std中(名字空间中的内容对外是不可见的),但是带来了一个新问题,无数现有的C++代码都依赖于使用了多年的伪标准库中的功能,如声明在<iostream.h>等头文件中的功能,使用std包装标准库导致现有代码的不可用,为了兼容这种情况,标准委员会为包装了std的那部分标准库创建了新的头文件,新的头文件的文件名与旧的一样,只是没有.h这个后缀,如<iostream.h>就变成了<iostream>。对于C头文件,采用同样的方法,但还在每个头文件名前加了字符c,如<string.h>就变成了<cstring>,<stdio.h>变成了<cstdio>。最好使用新的文件头,使用新的文件头的C++程序,需要使用using namespace std或者using namespace std::指定的类名,等方法来使需要的类对于我们的代码可视。

2 自定义的头文件
为了防止头文件被重复引用,最好使用预处理定义,如下所示:

#ifndef MYHEAD_H
#define MYHEAD_H
……//头文件中的内容
#endif
</div>

 

(1)#ifndef:
   指示符#ifndef用来检查头文件的内容是否在前面已经被定义过,如果定义过,则#ifndef与#endif之间的语句将不被执行.所以习惯上要把头文件的定义写在这两个语句之间.
如:对于MYHEAD.H这个头文件

#ifndef MYHEAD_H
#define MYHEAD_H

#include "myhead.h"

  ......

#endif

</div>

(2) #ifdef
  指示符#ifdef常常被用来判断一个预处理器常量是否已被定义,以便有条件地包含程序代码。
如:

 int main()
 {
  #ifdef DEBUG
  cout<<"Beginning execution of main()\n";
  #endif
  string word;
  vector<string> text;
  while(cin>>word)
  {
 #ifdef DEBUG
 cout<<"word read:"<<word<<"\n";
 #endif
 text.push_back(word); 
  }
 //..... }
</div>

在此程序中,如果定义了DEBUG,则其中包含的两个语句都将被执行,如果没有定义,则其中的两个输出语句不被执行。

3 预处理相关知识
(1) #ifdef :判断一个预处理常量是否被定义,如#infef DEGUG
(2) #ifndef:判断一个预处理常量是否没被定义
(3) #define:定义一个预处理常量,如#define DEBUG
(4) #include
(5) #endif
(6) 对预处理常量的定义还可以在编译时进行,如CC –D DEBUG main.c
(7)编译C++程序时,编译器自动定义了一个预处理器名字__cplusplus(注意前面有两个下划线),因此可以根据这个来判断该程序是否是C++程序,以便有条件地包含一些代码,如:

#ifndef MYHEAD_H
#define MYHEAD_H
#ifdef __cplusplus
extern "C" {
#endif
int DMpostprocessing();
#ifdef __cplusplus
}
#endif
#endif
</div>

(8)在编译C程序时,编译器会自动定义预处理常量__STDC__。当然__cplusplus和__STDC__ 不会同时被定义;
(9)另外两个比较有用的预定义常量是__LINE__(记录文件已经被编译的行数)和__FILE__(包含正在被编译的文件名称)。使用如下:

if(element_count==0)
 cerr<<"Error:"<<__FILE__
   <<":line"<<__LINE__
   <<"element_count must be non-zero.\n";
</div>

(10) __DATE__:编译日期,当前被编译文件的编译日期
(11) __TIME__:编译时间,当前被编译文件的编译时间
格式如:hh:mm:ss

 08:17:05   Oct 31 2006
(12) C库头文件的C++名字总是以字母C开头,后面去掉.h,如assert.h在C++中为cassert;

assert()是C语言标准库中提供的一个通用预处理器宏。常用其来判断一个必需的前提条件,以便程序能够正确执行。与其关联的头文件是:#include <assert.h>
如:

 assert(filename!=0);
</div>

表示:如果后面的程序能够正确执行,需要filename不为0,如是条件为假,即其等于0,断言失败,则程序将输出诊断消息,然后终止。

其c++名字是:cassert
C库头文件的C++名字总是以字母C开头
注:在C++中使用C标准库中的头文件时,一定要使用using namespace std;来使其处在一个名字空间中,才能正确使用

(13)在C++中头文件后缀各不相同,因此标准的C++头文件没有指定后缀

4 C++中的文件输入输出

头文件:#include <fstream>

使用文件输入输出实例:

 #include <fstream>
//为了打开一个输出文件,先声明一个ofstream类型的对象:
 ofstream outfile("name-of-file");
//为了测试是否已经成功打开了一个文件,如下判断:
 //如文件不能打开值为false
 if(!outfile)
   cerr<<"Sorry! We were unable to open the file!\n";

//为了打开一个输入文件,先声明一个ifstream类型的对象:
  ifstream infile("name of file");
  if(!infile)
   cerr<<"Sorry! We were unable to open the file!\n";

一个简单程序:
  #include <iostream>
  #include <fstream>
  #include <string>

  int main()
  {
   ofstream outfile("out_file");
 ifstream infile("in_file");
 if(!infile){
   cerr<<"error:unable to open input file!\n";
   return -1;
 }
 if(!outfile) {
   cerr<<"error:unable to open output file!\n";
   return -2;
 }
 string word;
 while (infile>>word)
  outfile<<word<<' ';
 return 0;
  }

</div>

头文件里有些什么?
头文件的使用主要体现在两个方面,一个是重(音chóng)用(即多次使用),另一个是共用。

那些提供标准库函数的头文件就是为了重用。很多程序或工程可能会用到这些标准库函数,把它们写在头文件里面,每次使用的时候只需要包含已经完成的头文件就可以了。

头文件的共用主要体现在C++的多文件结构中。由于目前的程序规模较小,尚不需要用到多文件结构,所以在此对头文件的共用不作展开。有兴趣的读者可以查阅相关书籍。
那么,如果我们要自己编写一个可以重用的头文件,里面应该写些什么呢?

类似于标准库函数,我们在头文件里面应该模块化地给出一些函数或功能。另外还应该包括独立实现这些函数或功能的常量、变量和类型的声明。

下面我们就来看一个头文件应用的实例:

//shape.h
#include "math.h"//在计算三角形面积时要用到正弦函数
const double pi=3.14159265358;//常量定义
struct circle//类型声明
{
  double r;
};
struct square
{
  double a;
};
struct rectangle
{
  double a,b;
};
struct triangle
{
  double a,b,c,alpha,beta,gamma;
};
double perimeter_of_circle(double r)//函数定义
{
  return 2*pi*r;
}
double area_of_circle(double r)
{
  return pi*r*r;
}
double perimeter_of_square(double a)
{
  return 4*a;
}
double area_of_square(double a)
{
  return a*a;
}
double perimeter_of_rectangle(double a,double b)
{
  return 2*(a+b);
}
double area_of_rectangle(double a,double b)
{
  return a*b;
}
double perimeter_of_triangle(double a,double b,double c)
{
  return a+b+c;
}
double area_of_triangle(double a,double b,double gamma)
{
  return sin(gamma/180*pi)*a*b/2;
}
//main.cpp
#include "iostream.h"
#include "shape.h"//包含我们编写好的shape.h
int main()
{
  circle c={2};
  square s={1};
  rectangle r={2,3};
  triangle t={3,4,5,36.86989,53.13011,90};
  cout <<"Perimeter of circle " <<perimeter_of_circle(c.r) <<endl;
  cout <<"Area of square " <<area_of_square(s.a) <<endl;
  cout <<"Perimeter of rectangle " <<perimeter_of_rectangle(r.a,r.b) <<endl;
  cout <<"Area of triangle " <<area_of_triangle(t.b,t.c,t.alpha) <<endl;
  return 0;
}
</div>

运行结果:

Perimeter of circle 12.5664
Area of square 1
Perimeter of rectangle 10
Area of triangle 6
</div>

我们编写好了shape.h头文件,以后用到计算图形周长或面积的时候,就不需要重新编写函数了,只需要包含这个头文件就行了。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 简单谈谈C++ 头文件系列之(iosfwd)
  • 深入理解C++中的文件操作
  • 有关C++头文件的包含顺序研究
  • C++中头文件的概念与基本编写方法
  • 解读C++编程的相关文件操作
  • C++实现显示MP3文件信息的方法
  • VC++创建msi文件的方法
  • VC++开发中完美解决头文件相互包含问题的方法解析
  • 浅析VC++中的头文件包含问题
  • C++获取zip文件列表方法

相关文章

  • 2017-05-28详解C++编程中的静态成员与可变数据成员
  • 2017-05-28C语言简单实现求n阶勒让德多项式的方法
  • 2017-05-28从汇编看c++中变量类型的深入分析
  • 2017-05-28C++中new的越界访问问题
  • 2017-05-28C语言求幂计算的高效解法
  • 2017-05-28static_cast,dynamic_cast,reinterpret_cast和const_cast的区别详解
  • 2017-05-28C语言中查询进程信号是否被遮罩或搁置的简单方法
  • 2017-05-28new和malloc的区别深入解析
  • 2017-05-28c++图像处理:24位真彩图颜色变换实例
  • 2017-05-28详解C++中如何将构造函数或析构函数的访问权限定为private

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C++读取到回车换行符问题处理
    • 解读C++编程中类模板的三种特化
    • C++中“#”号的使用技巧
    • c语言实现词频统计的简单实例
    • C语言中 “_at()” 特殊地址定位详解
    • stl常用算法(Algorithms)介绍(stl排序算法、非变序型队列)
    • 浅谈c++中的while(cin)问题
    • C++利用链栈实现表达式求值
    • C++实现简单的职工信息管理系统
    • 实例讲解C++编程中的虚函数与虚基类

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有