程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++中頭文件的概念與根本編寫辦法

C++中頭文件的概念與根本編寫辦法

編輯:關於C++

C++中頭文件的概念與根本編寫辦法。本站提示廣大學習愛好者:(C++中頭文件的概念與根本編寫辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是C++中頭文件的概念與根本編寫辦法正文


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

 

(1)#ifndef:
   指導符#ifndef用來檢討頭文件的內容能否在後面曾經被界說過,假如界說過,則#ifndef與#endif之間的語句將不被履行.所以習氣上要把頭文件的界說寫在這兩個語句之間.
如:關於MYHEAD.H這個頭文件

#ifndef MYHEAD_H
#define MYHEAD_H

#include "myhead.h"

  ......

#endif

(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); 
  }
 //..... }

在此法式中,假如界說了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

(8)在編譯C法式時,編譯器會主動界說預處置常量__STDC__。固然__cplusplus和__STDC__ 不會同時被界說;
(9)別的兩個比擬有效的預界說常量是__LINE__(記載文件曾經被編譯的行數)和__FILE__(包括正在被編譯的文件稱號)。應用以下:

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

(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);

表現:假如前面的法式可以或許准確履行,須要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;
  }

頭文件裡有些甚麼?
頭文件的應用重要表現在兩個方面,一個是重(音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;
}

運轉成果:

Perimeter of circle 12.5664
Area of square 1
Perimeter of rectangle 10
Area of triangle 6

我們編寫好了shape.h頭文件,今後用到盤算圖形周長或面積的時刻,就不須要從新編寫函數了,只須要包括這個頭文件就好了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved