#pragma once這是一個比較經常使用的C/C++雜注,只要在頭文件的最開始加入這條雜注,就可以保證頭文件只被編譯一次。
#pragma once是編譯器相關的,有的編譯器支持,有的編譯器不支持,具體狀況請查看編譯器API文檔,不過如今大部分編譯器都有這個雜注了。
#ifndef,#define,#endif是C/C++語言中的宏定義,經過宏定義避免文件屢次編譯。因此在全部支持C++語言的編譯器上都是有效的,若是寫的程序要跨平臺,最好使用這種方式。
寫法:
方式一:
#ifndef _SOMEFILE_H_
#define _SOMEFILE_H_
.......... // 一些聲明語句
#endif
方式二:
#pragma once
... ... // 一些聲明語句
比較:
#ifndef的方式依賴於宏名字不能衝突,這不光能夠保證同一個文件不會被包含屢次,也能保證內容徹底相同的兩個文件不會被不當心同時包含。固然,缺點就是若是不一樣頭文件的宏名不當心「撞車」,可能就會致使頭文件明明存在,編譯器卻硬說找不到聲明的情況。
#pragma once則由編譯器提供保證:同一個文件不會被編譯屢次。注意這裏所說的「同一個文件」是指物理上的一個文件,而不是指內容相同的兩個文件。帶來的好處是,你沒必要再費勁想個宏名了,固然也就不會出現宏名碰撞引起的奇怪問題。對應的缺點就是若是某個頭文件有多份拷貝,本方法不能保證他們不被重複包含。固然,相比宏名碰撞引起的「找不到聲明」的問題,重複包含更容易被發現並修正。
方式一由語言支持因此移植性好,方式二 能夠避免名字衝突
#pragma once方式產生於#ifndef以後,所以不少人可能甚至沒有據說過。目前看來#ifndef更受到推崇。由於#ifndef受語言天生的支持,不受編譯器的任何限制;而#pragma once方式卻不受一些較老版本的編譯器支持,換言之,它的兼容性不夠好。也許,再過幾年等舊的編譯器死絕了,這就不是什麼問題了。
我還看到一種用法是把二者放在一塊兒的:
#pragma once
#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__
... ... // 一些聲明語句
#endif
看起來彷佛是想兼有二者的優勢。不過只要使用了#ifndef就會有宏名衝突的危險,因此混用兩種方法彷佛不能帶來更多的好處,卻是會讓一些不熟悉的人感到困惑。文檔