1. 程式人生 > >C/C++避免標頭檔案重複包含的方法

C/C++避免標頭檔案重複包含的方法

C/C++避免標頭檔案重複包含的方法

在實際的程式設計過程中,因為會使用多個檔案,所以在檔案中不可避免的要引入一些標頭檔案,這樣就可能會出現一個頭檔案被 include 多次,在C/C++中有幾種不同的方式可以解決這個問題,總體功能相差不大,但依然存在細微差別。

1. #ifndef

格式如下:

#ifndef __COMPLEX__
#define __COMPLEX__

//標頭檔案主體

#endif

或者

#ifndef __COMPLEX_H__
#define __COMPLEX_H__

//標頭檔案主體

#endif

作用:相同的兩個檔案不會被重複包含。

優點:

  1. 受C/C++語言標準的支援,不受編譯器的限制。
  2. 不僅僅侷限於避免同一個檔案被重複包含,也能避免內容完全相同的兩個檔案(或程式碼片段)被重複包含。

缺點:

  1. 如果不同標頭檔案中的巨集名恰好相同,可能就會導致你看到標頭檔案明明存在,編譯器卻說找不到宣告的情況。
  2. 由於編譯器每次都需要開啟標頭檔案才能判定是否有重複定義,因此在編譯大型專案時,#ifndef會使得編譯時間相對較長。

2. #pragma once

格式如下:

#pragma once

//標頭檔案主體

作用:物理上的同一個檔案不會被重複包含。

優點:

  1. 避免#ifndef中因為巨集名相同導致的問題。
  2. 由於編譯器不需要開啟標頭檔案就能判定是否有重複定義,因此在編譯大型專案時,比#ifndef更快。

缺點:

  1. #pragma once只針對同一檔案有效,對相同的兩個檔案(或程式碼片段)使用無效。
  2. #pragma once不受一些較老版本的編譯器支援,一些支援了的編譯器又打算去掉它,所以它的相容性可能不夠好。

3. 混合使用

格式如下:

#pragma once
#ifndef __COMPLEX_H__
#define __COMPLEX_H__

//標頭檔案主體

#endif

混合使用需要注意的是:
1.只要使用了#ifndef就會有巨集名衝突的危險。
2.混合使用無法避免不支援#pragma once的編譯器報錯。
所以混合使用並不一定能得到很好的效果,具體怎麼使用,需要視情況而定。