1、頭文件

轉 html

http://www.cnblogs.com/BlogNetSpace/archive/2009/02/12/1388943.htmlc++

http://man.chinaunix.net/develop/c&c++/c/c.htm#_Toc520634042編程

http://zh-google-styleguide.readthedocs.org/en/latest/google-cpp-styleguide/headers/設計模式

目錄:ide

一、頭文件的include兩個格式函數

二、頭文件的條件編譯ui

三、頭文件依賴:前置聲明this

四、頭文件包含類容google

 

 

一、頭文件的include兩個格式spa

1.一、#include <....h> 這種格式用來引用標準庫的頭文件,編譯器默認從標準庫開始搜索

1.二、#include "......h" 這種格式用來引用非標準庫的頭文件,編譯器默認從工程當前目錄開始搜索

二、頭文件#define保護。即全部頭文件應該使用#define進行保護,防止頭文件被多重包含。就涉及到條件編譯:

#ifndef, #def, #endif,#ifdef,#define

2.一、條件編譯命令

#ifdef MY_HEADER_H    // 若是定義了MY_HEADER_H,就編譯程序段1

程序段1;

#else //不然就編譯程序段2

程序段2;

#endif

#else 部分也能夠沒有:

#ifdef

code1;

#endif

這個也能夠用在某些功能文件未實現以前和實現以後使用這個條件編譯命令起到開關功能。也能夠用在調試功能上。在調試階段須要輸出一些類容,不是調試階段就不輸出。固然在調試的時候定義

#define DEBUG 1 或者 #define DEBUG 0

這樣在調試以前加這一句,就能夠在調試的時候輸出cout的內容,當不須要調試的時候,就將這個#define語句刪掉,這樣,就能正常執行程序的功能,不用輸出調試語句,這個很方便,就不用本身去刪掉或註釋掉較多的輸出語句。不錯的功能

#ifdef DEBUG

cout<<"the debug phase"<<endl;

#endif

 

2.二、另一種跟1比較類似,可是是反着的。

#ifndef DEBUG

code1;

#else 

code2;

#endif

解釋:相對ifdef來講,中間多了一個n,表示沒有。就是若是沒有定義DEBUG,編譯code1,不然編譯coude2

#ifndef MY_HEADER_H

#define MY_HEADER_H

.....

....

....

...

...

#endif

這個是爲了防止MY_HEADER_H被重複包含。全部頭文件都應該使用 #define 防止頭文件被多重包含

2.三、另一種形式,也能夠用到code裏面,就是code裏面嵌入這個條件編譯,這樣就不用編譯所有:

#if 表達式

code1;

#else

code2;

#endif

表示若是表達式爲真,就編譯code1,不然編譯code2.

 

 

3 頭文件依賴

對於頭文件依賴,能用前置聲明的儘可能不使用#include。又涉及到了前置聲明

3.1 前置聲明(前向聲明):

class Screen;

在程序中引入類類型,在聲明以後,定義以前,類是一個不徹底類型,即知道該類是一個類型,可是並不知道包含哪些成員。只能以有限的方式使用。只要類名一出現,就認爲該類已經聲明。

class B;
class A{

    public:
        B  *b;
};

class B{
public:
    ....;
    ....;
};

對於B來講,就是一個前置聲明,A要用到B,可是B不在A以前定義,A要使用B就要先聲明B。

  • 不徹底類型不能定義該類型的對象
  • 只能用於定義該類型的指針或者引用
  • 或者用於聲明(不是定義)使用該類型做爲行參類型或返回類型的函數
  • 在使用類的對象以前,必定要定義該類。這樣,編譯器就會給該類預約相應的存儲空間。
  • 在使用引用或者指針訪問類的成員以前,必須定義類

轉 

http://blog.csdn.net/raodotcong/article/details/6431502

http://patmusing.blog.163.com/blog/static/135834960201038113714199/

第一個博客裏面寫的是:類h文件引用其餘文件的類的時候,能夠不用引入頭文件,直接先聲明須要引用的類名,而是在類實現文件裏面引用其餘類的h文件。這樣就避免了一個頭文件包含了其餘的頭文件,減小了這個文件對其餘頭文件的依賴。由於若是一個頭文件改變,就會致使全部包含這個頭文件的代碼被從新編譯。因此儘可能在頭文件少包含其餘的頭文件,能夠選擇在cpp文件裏面包含其餘的頭文件,由於在cpp文件裏面須要引用到其餘類定義的成員,這個時候就必須先進行引用其餘類的頭文件。只是在實現文件cpp文件裏面包含其餘的頭文件是比較好的編程風格。

包含:若是你的類是其餘類的子類, 或者含有類型爲其餘類的非靜態數據成員(對象), 則必須包含其餘類所在的頭文件. 

 

四、頭文件包含類容

頭文件通常包含類的聲明,extern變量的聲明和函數的聲明。

定義只有一次,聲明能夠屢次。

4.1 頭文件用於聲明,而不是用於定義

extern int ival = 10;//初始化,爲定義

double fica;//沒有extern,也是一個定義

沒有extern,同一個程序中兩個以上文件含有上述任一個定義都會連接錯誤。

由於頭文件包含在多個源文件,因此不該該含有變量或函數的定義。

較好的:extern double fical;

頭文件能夠包含:定義類,值在編譯的時候就知道value的const對象,inline函數。

 

4.2 一些const對象定義在頭文件中

若是const變量是由常量表達式初始化,就定義在頭文件,若是不是,就不要放頭文件,同時在以前加上extern以便其餘文件共享。

 

4.3 頭文件中能夠包括:用戶構造的數據類型(如枚舉類型),外部變量,外部函數、常量和內聯函數等具備必定通用性或經常使用的量。
而通常性的變量和函數定義不宜放在頭文件中。

頭文件用於聲明,而不用於定義。定義只能夠出現一次,而聲明能夠出現屢次。由於頭文件被設計用來包含在多個源文件中,因此不該該含有變量或者函數的定義。
下列語句是定義,因此不該該放在頭文件裏: 
Extern int ival = 10;           //有初始化,因此是定義
Double fica_rate;               //沒有extern關鍵字,因此也是定義
 (下面這三段轉的:http://blog.163.com/cindy_19810217/blog/static/201059118201391035246899/)
對於頭文件不該該含有定義這一規則,有三個例外:類定義、枚舉的定義、值在編譯時就已知的,const對象、inline函數。const對象(變量)默認是定義該變量的文件的局部變量,鏈接類型爲內鏈接。每一個包含該頭文件的源文件都有了本身的const變量,都爲它分配的存儲空間,其名稱和值都同樣。若是const變量不是用常量表達式初始化的,那麼它就不該該在頭文件中定義。它應該和其餘的變量同樣,應該定義在一個源文件中並初始化,在頭文件中爲它添加extern聲明,以便被多個文件共享。
 
內鏈接:類定義、全局常量、const對象(變量)、typedef類型、宏定義 默認爲內鏈接的。另外,定義時被顯示加上static關鍵字的全局變量和全局函數,具備文件做用據,鏈接類型也爲內鏈接。默認爲內鏈接的標識符,若是顯示加上extern關鍵字,即變成外鏈接。
 
外鏈接:全局變量、全局函數默認是外鏈接的。

(下面的圖片時轉的:http://blog.sina.com.cn/s/blog_6db80bb101013ute.html)

轉:http://www.weixueyuan.net/view/5834.html

 

 

總結:(C++primer:c++是一種靜態類型語言:變量和函數在使用前必須先聲明。變量能夠聲明屢次可是隻能定義一次)

轉的總結:http://zh-google-styleguide.readthedocs.org/en/latest/google-cpp-styleguide/headers/

  1. 避免多重包含是學編程時最基本的要求;
  2. 前置聲明是爲了下降編譯依賴,防止修改一個頭文件引起多米諾效應;
  3. 內聯函數的合理使用可提升代碼執行效率;
  4. -inl.h 可提升代碼可讀性 (通常用不到吧:D);
  5. 標準化函數參數順序能夠提升可讀性和易維護性 (對函數參數的堆棧空間有輕微影響, 我之前大可能是相同類型放在一塊兒);
  6. 包含文件的名稱使用 . 和 .. 雖然方便卻易混亂, 使用比較完整的項目路徑看上去很清晰, 很條理, 包含文件的次序除了美觀以外, 最重要的是能夠減小隱藏依賴, 使每一個頭文件在 「最須要編譯」 (對應源文件處 :D) 的地方編譯, 有人提出庫文件放在最後, 這樣出錯先是項目內的文件, 頭文件都放在對應源文件的最前面, 這一點足以保證內部錯誤的及時發現了。

下面時之後要概括的一些東西,一一寫下來:

const專題,static, extern專題,class和struct區別專題,指針專題,讀寫文件專題,string專題,虛函數專題(涉及到重載,覆蓋(至關於重寫)),內聯函數專題, this指針, 析構函數,複製函數,賦值函數,初始化問題,設計模式

相關文章
相關標籤/搜索