C語言中的標頭檔案中的巨集定義

weixin_45783996發表於2020-10-08

常見內容

原始檔的頭部一般都會有#include指令來包含標頭檔案,標頭檔案的內容一般就是

  • #define語句
  • extern宣告
  • 函式原型宣告
    #include#define都是C的預處理指令,#include就是把檔案中的所有內容貼上到原始檔中,僅此而已!

(一般)格式

標頭檔案的編寫一般遵循如下格式

#ifndef _MYLIB_H_
#define _MYLIB_H_
/*檔案的內容放在這裡,如*/
int a;
typedef struct _node{
    int value;
    struct _node *next;
}Node;
#define PI 3.14
#endif

這樣寫的目的是為了防止重複匯入,因為前處理器在處理ifndef指令的時候,如果_MYLIB_H_被定義過了,就會直接跳轉到#endif處,中間的內容在真正編譯的時候不會被包括進去。_MYLIB_H_可以改成任何名字,不過最好按照規範:所有字母大寫,.改成_。
剛開始我一直以為_MYLIB_H_被定義為下面的所有語句,然後就很納悶,這個define怎麼和巨集定義的define不太一樣,其實在這裡_MYLIB_H_就是被定義成了一個空的東西,有定義但是什麼值都沒有。然後如果又被引入一次,前處理器就會跳到#endif去,使得標頭檔案的內容不被重複包含(雖然應該是被重複貼上了)

一些規範

儘管條件包含可以避免包含多個同一檔案,使用者就不必考慮標頭檔案之間的依賴關係,但是不同原始檔的連結是在最後一步進行的,而預處理是在第一步進行的,所以如果標頭檔案中有變數的定義而且被多個檔案包含,在連結的時候就會報重複定義的錯誤,所以,一個好的規範就是:

標頭檔案中不要有函式或者變數的定義!

相關文章