#ifndef
和 #pragma once
都是用來防止頭文件被重復包含的,但它們的工作方式和兼容性有所不同:
#ifndef
是 C++ 的標準語法,它依賴于不重復的宏名稱,保證了包含在#endif
的內容不會被重復包含。這個內容可以是一個文件的所有內容,或者僅僅是一段代碼。例如:
#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__
... // 整個文件的內容,或某段代碼
#endif
#pragma once
并不是 C++ 的原生語法,而是編譯器的一種支持,所以并不是所有的編譯器都能夠支持。#pragma once
是針對物理文件的一個標記,標記該文件不會被#include
多次,不能只針對文件中某段代碼進行標記。例如:
#pragma once
... // 聲明、定義語句
需要注意的是,#pragma once
不能保證多個文件的拷貝不會被重復包含,但這種錯誤更容易發現,且 #pragma once
大大提高了編譯效率。
總的來說,#pragma once
的代碼更簡潔,避免了宏名沖突,提高了編譯效率,但它的兼容性可能不夠好,因為并不是所有的編譯器都支持它。而 #ifndef
受 C/C++ 語言標準的支持,不受編譯器的任何限制,可以避免名字沖突,移植性好,但如果不同頭文件的宏名不小心“撞車”,可能就會導致頭文件明明存在,編譯器卻硬說找不到聲明的狀況。因此,選擇使用哪種方式主要取決于你的具體需求和環境。