C++中頭文件的概念與基本編寫方法
1 標(biāo)準(zhǔn)庫中的頭文件
C++標(biāo)準(zhǔn)庫中的一切內(nèi)容都被放在名字空間std中(名字空間中的內(nèi)容對外是不可見的),但是帶來了一個新問題,無數(shù)現(xiàn)有的C++代碼都依賴于使用了多年的偽標(biāo)準(zhǔn)庫中的功能,如聲明在<iostream.h>等頭文件中的功能,使用std包裝標(biāo)準(zhǔn)庫導(dǎo)致現(xiàn)有代碼的不可用,為了兼容這種情況,標(biāo)準(zhǔn)委員會為包裝了std的那部分標(biāo)準(zhǔn)庫創(chuàng)建了新的頭文件,新的頭文件的文件名與舊的一樣,只是沒有.h這個后綴,如<iostream.h>就變成了<iostream>。對于C頭文件,采用同樣的方法,但還在每個頭文件名前加了字符c,如<string.h>就變成了<cstring>,<stdio.h>變成了<cstdio>。最好使用新的文件頭,使用新的文件頭的C++程序,需要使用using namespace std或者using namespace std::指定的類名,等方法來使需要的類對于我們的代碼可視。
2 自定義的頭文件
為了防止頭文件被重復(fù)引用,最好使用預(yù)處理定義,如下所示:
#ifndef MYHEAD_H #define MYHEAD_H ……//頭文件中的內(nèi)容 #endif
(1)#ifndef:
指示符#ifndef用來檢查頭文件的內(nèi)容是否在前面已經(jīng)被定義過,如果定義過,則#ifndef與#endif之間的語句將不被執(zhí)行.所以習(xí)慣上要把頭文件的定義寫在這兩個語句之間.
如:對于MYHEAD.H這個頭文件
#ifndef MYHEAD_H #define MYHEAD_H #include "myhead.h" ...... #endif
(2) #ifdef
指示符#ifdef常常被用來判斷一個預(yù)處理器常量是否已被定義,以便有條件地包含程序代碼。
如:
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,則其中包含的兩個語句都將被執(zhí)行,如果沒有定義,則其中的兩個輸出語句不被執(zhí)行。
3 預(yù)處理相關(guān)知識
(1) #ifdef :判斷一個預(yù)處理常量是否被定義,如#infef DEGUG
(2) #ifndef:判斷一個預(yù)處理常量是否沒被定義
(3) #define:定義一個預(yù)處理常量,如#define DEBUG
(4) #include
(5) #endif
(6) 對預(yù)處理常量的定義還可以在編譯時進行,如CC –D DEBUG main.c
(7)編譯C++程序時,編譯器自動定義了一個預(yù)處理器名字__cplusplus(注意前面有兩個下劃線),因此可以根據(jù)這個來判斷該程序是否是C++程序,以便有條件地包含一些代碼,如:
#ifndef MYHEAD_H #define MYHEAD_H #ifdef __cplusplus extern "C" { #endif int DMpostprocessing(); #ifdef __cplusplus } #endif #endif
(8)在編譯C程序時,編譯器會自動定義預(yù)處理常量__STDC__。當(dāng)然__cplusplus和__STDC__ 不會同時被定義;
(9)另外兩個比較有用的預(yù)定義常量是__LINE__(記錄文件已經(jīng)被編譯的行數(shù))和__FILE__(包含正在被編譯的文件名稱)。使用如下:
if(element_count==0) cerr<<"Error:"<<__FILE__ <<":line"<<__LINE__ <<"element_count must be non-zero.\n";
(10) __DATE__:編譯日期,當(dāng)前被編譯文件的編譯日期
(11) __TIME__:編譯時間,當(dāng)前被編譯文件的編譯時間
格式如:hh:mm:ss
08:17:05 Oct 31 2006
(12) C庫頭文件的C++名字總是以字母C開頭,后面去掉.h,如assert.h在C++中為cassert;
assert()是C語言標(biāo)準(zhǔn)庫中提供的一個通用預(yù)處理器宏。常用其來判斷一個必需的前提條件,以便程序能夠正確執(zhí)行。與其關(guān)聯(lián)的頭文件是:#include <assert.h>
如:
assert(filename!=0);
表示:如果后面的程序能夠正確執(zhí)行,需要filename不為0,如是條件為假,即其等于0,斷言失敗,則程序?qū)⑤敵鲈\斷消息,然后終止。
其c++名字是:cassert
C庫頭文件的C++名字總是以字母C開頭
注:在C++中使用C標(biāo)準(zhǔn)庫中的頭文件時,一定要使用using namespace std;來使其處在一個名字空間中,才能正確使用
(13)在C++中頭文件后綴各不相同,因此標(biāo)準(zhǔn)的C++頭文件沒有指定后綴
4 C++中的文件輸入輸出
頭文件:#include <fstream>
使用文件輸入輸出實例:
#include <fstream> //為了打開一個輸出文件,先聲明一個ofstream類型的對象: ofstream outfile("name-of-file"); //為了測試是否已經(jīng)成功打開了一個文件,如下判斷: //如文件不能打開值為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; }
頭文件里有些什么?
頭文件的使用主要體現(xiàn)在兩個方面,一個是重(音chóng)用(即多次使用),另一個是共用。
那些提供標(biāo)準(zhǔn)庫函數(shù)的頭文件就是為了重用。很多程序或工程可能會用到這些標(biāo)準(zhǔn)庫函數(shù),把它們寫在頭文件里面,每次使用的時候只需要包含已經(jīng)完成的頭文件就可以了。
頭文件的共用主要體現(xiàn)在C++的多文件結(jié)構(gòu)中。由于目前的程序規(guī)模較小,尚不需要用到多文件結(jié)構(gòu),所以在此對頭文件的共用不作展開。有興趣的讀者可以查閱相關(guān)書籍。
那么,如果我們要自己編寫一個可以重用的頭文件,里面應(yīng)該寫些什么呢?
類似于標(biāo)準(zhǔn)庫函數(shù),我們在頭文件里面應(yīng)該模塊化地給出一些函數(shù)或功能。另外還應(yīng)該包括獨立實現(xiàn)這些函數(shù)或功能的常量、變量和類型的聲明。
下面我們就來看一個頭文件應(yīng)用的實例:
//shape.h #include "math.h"http://在計算三角形面積時要用到正弦函數(shù) 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)//函數(shù)定義 { 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"http://包含我們編寫好的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; }
運行結(jié)果:
Perimeter of circle 12.5664 Area of square 1 Perimeter of rectangle 10 Area of triangle 6
我們編寫好了shape.h頭文件,以后用到計算圖形周長或面積的時候,就不需要重新編寫函數(shù)了,只需要包含這個頭文件就行了。
上一篇:C語言中sizeof()與strlen()函數(shù)的使用入門及對比
欄 目:C語言
下一篇:C語言編程中的聯(lián)合體union入門學(xué)習(xí)教程
本文標(biāo)題:C++中頭文件的概念與基本編寫方法
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2611.html
您可能感興趣的文章
- 04-02c語言沒有round函數(shù) round c語言
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實現(xiàn)全排列算法的方法詳解
- 01-10fatal error LNK1104: 無法打開文件“l(fā)ibc.lib”的解決方法
- 01-10c++中inline的用法分析
- 01-10用C++實現(xiàn)DBSCAN聚類算法
- 01-10全排列算法的非遞歸實現(xiàn)與遞歸實現(xiàn)的方法(C++)
- 01-10C++大數(shù)模板(推薦)
- 01-10淺談C/C++中的static與extern關(guān)鍵字的使用詳解
- 01-10深入C/C++浮點數(shù)在內(nèi)存中的存儲方式詳解


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機閱讀
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 04-02jquery與jsp,用jquery
- 01-10C#中split用法實例總結(jié)
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢data目錄下的sessions文件夾有什