2016-04-24 99 views
4

爲什麼有時我看到爲什麼#定義一個空的宏?

#define __Empty_macro__ 

在C?它的用法是什麼? ex。

#ifndef _BUILDIN_H_ 
#define _BUILDIN_H_ 
//codes never used _BUILDIN_H_ ... 
#endif /* _BUILDIN_H_ */ 

恩源的殼實現:https://github.com/dingdongnigetou/shell/blob/master/include/build_in.h

+4

可能的重複[爲什麼#ifndef和#define在C++頭文件中使用](http://stackoverflow.com/questions/1653958/why-are-ifndef-and-define-used-in-c-header - 文件)編輯:這個問題最初也是用C++標記的。就我所知,這個問題的答案與C++和c相同,並且已經在重複中得到了答案。 – user2079303

+1

嗯,我打電話給那些未定義的行爲 – user3528438

+0

@ user3528438,你基於什麼調用那些未定義的行爲? – StoryTeller

回答

2

CC++編程語言,一個#include後衛,有時也被稱爲macro guard,是使用打交道時避免double inclusion問題的特定構造包含指令。將#include警衛添加到頭文件是使該文件具有冪等性的一種方法。例如,考慮在child.h文件中包含grandfather.hfather.h頭文件。

文件 「grandfather.h」

#ifndef GRANDFATHER_H 
#define GRANDFATHER_H 

struct foo { 
    int member; 
}; 

#endif /* GRANDFATHER_H */ 

文件 「father.h」

#include "grandfather.h" 

文件 「child.c」

#include "grandfather.h" 
#include "father.h" 

這裏,第一個包含"grandfather.h"會導致定義宏GRANDFATHER_H。然後,當「child.c」第二次包含「grandfather.h」(因爲father.h還包括grandfather.h),則包括father.h#ifndef測試返回false,並且預處理器跳到文件grandfather.h的#endif,從而避免struct foo的第二個定義。程序編譯正確。

3

使用它們有不同的原因。例如,如果需要只包含一個庫一次。你可以定義一個宏。然後你檢查這個宏是否已經被定義,這樣你可以跳過這個包含。等等。

在這裏有大約一個解釋:inclusion guard

6

因爲一個「空宏」依然存在,這是可以檢查如果它們存在使用#ifdef#ifndef

通常,此行爲用於防止包含相同頭的多個副本(又名「包括守衛」,這就是您的示例)。但是,它也可以用來有條件地包含程序的某些部分。

有時,像NDEBUG_DEBUG這樣的宏只是被定義的,可以改變程序輸出,比如通過包含更昂貴的運行時檢查,這在最終產品中是不可取的,但可以幫助跟蹤開發過程中的錯誤。

自定義「空白」定義可以類似地用於包含或排除程序構建中的某些二進制功能。這可以通過性能(刪除日誌記錄),安全性(刪除程序的敏感部分),業務原因(某些功能可能需要更昂貴的程序版本)等等來完成。

+1

當沒有有意義的擴展時,它們還提供了一個便利的回退。例如,當試圖爲你的頭文件定義一個可移植的'DLL_EXPORT'規範時。 – StoryTeller