【規則1-2-1】爲了防止頭文件被重複引用,應當用ifndef/define/endif結構產生預處理塊。
一、爲什麼會出現頭文件被重複引用的問題
在一個CPP文件中,可以包含多個頭文件,而頭文件間又是可以相互引用的,這就導致一個CPP文件中可能間接多次包含某個頭文件,如果頭文件中 沒有防止 多次編譯的語句,就會出現頭文件被重複定義的編譯錯誤
二、怎麼防止 頭文件被重複引用
1、使用 ifndef/define/endif 結構產生預處理塊
適用條件:在任意編譯環境都可以使用
2、使用 #pragma once
適用條件:在微軟的開發工具上的使用
三、命名規則
一般是頭文件名全大寫,前後加下劃線,並把文件名中的“.”也變成下劃線
四、舉例
#ifndef方式
-
/********************************************************************
-
created: 2013/06/16 23:01
-
Filename: Test.h
-
author: Neo
-
*********************************************************************/
-
#ifndef _TEST_H__
-
#define _TEST_H__
-
-
class Test
-
{
-
public:
-
Test();
-
~Test();
-
-
-
private:
-
int m_nCount;
-
-
};
-
#endif
#pragma once方式
-
/********************************************************************
-
created: 2013/06/16 23:01
-
Filename: Test.h
-
author: Neo
-
*********************************************************************/
-
#pragma
-
-
class Test
-
{
-
public:
-
Test();
-
~Test();
-
-
-
private:
-
int m_nCount;
-
-
};
五、執行過程
頭文件_TEST_H第一次執行時,還沒有被define,則滿足#ifndef_TEST_H的條件,
則執行它下面的內容 #define_TEST_H 和 Test類的聲明;
之後再編譯到該頭文件時,由於已經定義了_TEST_H了,所以語句#ifndef_TEST_H 不執行,
而執行#endif的語句,這裏沒有語句,就直接結束了
因此,在某一個cpp文件中,多次包含了#include<Test.h>時,就不會出現頭文件被重複定義的編譯錯誤了
注:
1、Test.h文件的組成:
(1)頭文件開頭處的版權和版本聲明。
(2)預處理塊。
(3)函數和類結構聲明等。
2、Test.cpp文件的組成:
(1)定義文件開頭處的版權和版本聲明。
(2)對一些頭文件的引用。
(3)程序的實現體(包括數據和代碼)
3、頭文件的作用:
(1) 通過頭文件來調用庫功能
在很多場合,源代碼不便(或不準)向用戶公佈,只要向用戶提供頭文件和二進制的庫即可。用戶只需要按照頭文件中的接口聲明來調用庫功能,而不必關心接口怎麼實現的。編譯器會從庫中提取相應的代碼。
(2) 頭文件能加強類型安全檢查
如果某個接口被實現或被使用時,其方式與頭文件中的聲明不一致,編譯器就會指出錯誤,這一簡單的規則能大大減輕程序員調試、改錯的負擔。