热门问题
时间线
聊天
视角

#pragma once

来自维基百科,自由的百科全书

Remove ads

CC++程式語言中,#pragma once是一個非標準但是被廣泛支援的前置處理符號,會讓所在的檔案在一個單獨的編譯中只被包含一次。以此方式,#pragma once提供類似include防範的目的,但是擁有較少的程式碼且能避免名稱的碰撞。

範例

請參考include防範裡其中一種狀況的範例或其他的使用方法。如下:

grandparent.h
#pragma once

struct foo 
{
    int member;
};
parent.h
#include "grandparent.h"
child.c
#include "grandparent.h"
#include "parent.h"

優缺點

使用#pragma once代替include防範將加快編譯速度,因為這是一種高階的機制;編譯器會自動比對檔案名稱或inode而不需要在標頭檔去判斷#ifndef#endif

另一方面,部份編譯器,例如GCCclang等,也包含特別的程式碼來識別和有效率的管理include防範。因此使用#pragma once並不會得到明顯的加速。[1][2][3]

此外,因為編譯器自己必須承擔管理#pragma once,它不必定義新的指令名稱,例如在include防範文章範例的H_GRANDFATHER。這能排除名稱碰撞的風險,意思就是至少第一次包含標頭檔不會再有錯誤

然而,這種高階的管理有好也有壞;設計者必須依賴編譯器正確的管理#pragma once。編譯器如果犯錯,例如沒有辨認出在相同檔案中的兩個不同符號連結名稱指標,此時編譯會錯誤。編譯器對於#pragma once可能包含相關的bug LCC-Win32 2004年[1][2]和GCC 1998年。[3]頁面存檔備份,存於網際網路檔案館)2005年,GCC檔案中將#pragma once列為「已淘汰」的特性。[4]頁面存檔備份,存於網際網路檔案館)隨著gcc 3.4的發布,gcc解決了#pragma once中的一些問題(主要是跟符號連結和硬連結有關),並且去掉了#pragma once的「已淘汰」的標籤。[5]頁面存檔備份,存於網際網路檔案館

Remove ads

編譯器支援

更多資訊 Compiler ...

參考文獻

外部連結

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads