欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++中頭文件的概念與基本編寫方法

 更新時間:2015年12月04日 17:44:01   作者:ywbab  
這篇文章主要介紹了C++中頭文件的概念與基本編寫方法,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下

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ù)了,只需要包含這個頭文件就行了。

相關(guān)文章

  • QT設(shè)置widget背景圖片不影響widget內(nèi)其他控件背景的方法

    QT設(shè)置widget背景圖片不影響widget內(nèi)其他控件背景的方法

    這篇文章主要給大家介紹了關(guān)于QT設(shè)置widget背景圖片不影響widget內(nèi)其他控件背景的方法,軟件的界面為了更直觀或美觀,常常需要通過圖片來表達,需要的朋友可以參考下
    2023-06-06
  • 堆基本操作實現(xiàn)最大堆

    堆基本操作實現(xiàn)最大堆

    這篇文章主要介紹了堆基本操作實現(xiàn)最大堆,需要的朋友可以參考下
    2014-02-02
  • C/C++高精度(加減乘除)算法的實現(xiàn)

    C/C++高精度(加減乘除)算法的實現(xiàn)

    高精度的算法,一般的方式是用一個很長的數(shù)組去記錄數(shù)據(jù),數(shù)組的每一位記錄固定位數(shù)的數(shù)字,記錄順序是低位到高位。本文將通過實例為大家介紹下高精度算法的實現(xiàn),感興趣的可以了解一下
    2022-12-12
  • 一篇文章帶你了解C++模板編程詳解

    一篇文章帶你了解C++模板編程詳解

    這篇文章主要介紹了C++的模板,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-11-11
  • opencv實現(xiàn)角點檢測

    opencv實現(xiàn)角點檢測

    這篇文章主要為大家詳細介紹了opencv實現(xiàn)角點檢測,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++ Opengl旋轉(zhuǎn)功能附源碼下載

    C++ Opengl旋轉(zhuǎn)功能附源碼下載

    這篇文章主要介紹了C++ Opengl旋轉(zhuǎn)功能附源碼下載,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • C++操作json文件以及jsoncpp配置詳解

    C++操作json文件以及jsoncpp配置詳解

    這篇文章主要給大家介紹了關(guān)于C++操作json文件以及jsoncpp配置的相關(guān)資料,文中通過實例代碼及圖片介紹的非常詳細,需要的朋友可以參考下
    2021-06-06
  • Mygui中文換行問題解決方案

    Mygui中文換行問題解決方案

    相信大家解決了中文輸入后一定會遇到如何解決中文輸入的問題,中文輸入換行問題是很多gui框架都存在的一個問題,需要的朋友可以了解下
    2012-11-11
  • C++中繼承基類與派生類的區(qū)別

    C++中繼承基類與派生類的區(qū)別

    這篇文章主要介紹了C++中繼承基類與派生類的區(qū)別,面向?qū)ο蟪绦蛟O(shè)計中最重要的一個概念是繼承。繼承允許我們依據(jù)另一個類來定義一個類,這使得創(chuàng)建和維護一個應(yīng)用程序變得更容易,需要的朋友可以參考下
    2023-05-05
  • C語言 makefile學(xué)習(xí)及實現(xiàn)實例

    C語言 makefile學(xué)習(xí)及實現(xiàn)實例

    這篇文章主要介紹了C語言 makefile學(xué)習(xí)及實現(xiàn)實例的相關(guān)資料,需要的朋友可以參考下
    2017-03-03

最新評論