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頭文件,今後用到盤算圖形周長或面積的時刻,就不須要從新編寫函數了,只須要包括這個頭文件就好了。