C語言在標頭檔案定義全域性變數的技巧

2021-10-05 16:11:21 字數 2280 閱讀 6885

在剛開始學習c語言的時候,可能很多人都聽過前輩說要少用goto,少用do{}while(),不要在標頭檔案定義全域性變數等,但實際上每個特性都有其合適的應用場合,只要正確的使用是不會有問題的,相反還可能給**帶來好處。

一般來說,我們寫程式的時候都不會定義特別多的全域性變數,這也是需要遵守的原則之一;但凡事都不是絕對的,假如有乙個程式有大量的變數都需要全域性使用,而這些全域性變數之間又沒有什麼關聯性,你會選擇怎樣的方式來處理這些全域性變數呢?

1、使用乙個結構體,專門用於存放這些全域性變數,這是個方法,也能不錯的解決問題,只是沒什麼關聯的資料還用結構體打包在一起,總覺得有點不對。

2、將這些全域性變數定義到乙個專門的檔案,不用結構體打包,然後在標頭檔案使用extern宣告,**需要用就包含這個標頭檔案就行了。

3、第二種方法需要在標頭檔案使用extern宣告每乙個全域性變數,假如要增加或者刪除乙個變數的都需要同時修改標頭檔案和原始檔,很是不方便,那就將這些全域性變數定義到頭檔案吧。

進入正題,其實第三種方法就是對第二種方法進行優化,讓修改只發生在乙個檔案,下面是示例**:

原始檔:

#include #define export_globals

#include "define_variable_in_header.h"

//編譯

//gcc define_variable_in_header.c

//預處理

//gcc -e define_variable_in_header.c -o define_variable_in_header.c.o

//gcc -e define_variable_in_header.h -o define_variable_in_header.h.o

int main(int argc,char *ar**)

標頭檔案:

#ifndef __define_variable_in_header_h

#define __define_variable_in_header_h

#ifdef export_globals

#define extern

#else

#define extern extern

#endif

extern unsigned int g_flag;

#endif/*__define_variable_in_header_h*/

原始檔很簡單就是先定義乙個巨集export_globals然後再包含對應的標頭檔案,注意順序不能變;對於標頭檔案,先檢測是否定義了export_globals巨集,如果定義了則將extern巨集定義為空,否則定義為extern關鍵字,然後下面就是我們需要定義的全域性變數,只不過前面都加了extern巨集;

我們都知道原始檔使用#include包含標頭檔案的時候幾乎可以認為是將整個標頭檔案的內容拷貝到原始檔中,對原始檔進行預處理,得到下面的內容:

# 1 "define_variable_in_header.c"

# 1 ""

# 1 ""

# 31 ""

# 1 "/usr/include/stdc-predef.h" 1 3 4

# 32 "" 2

# 1 "define_variable_in_header.c"

# 1 "define_variable_in_header.h" 1

# 10 "define_variable_in_header.h"

unsigned int g_flag;

# 7 "define_variable_in_header.c" 2

int main(int argc,char *ar**)

我們可以在原始檔看到全域性變數的定義了,那標頭檔案呢:

# 1 "define_variable_in_header.h"

# 1 ""

# 1 ""

# 31 ""

# 1 "/usr/include/stdc-predef.h" 1 3 4

# 32 "" 2

# 1 "define_variable_in_header.h"

# 10 "define_variable_in_header.h"

extern unsigned int g_flag;

可以看到標頭檔案經過預處理後,就得到了全域性變數的宣告了,這樣做每次需要修改全域性變數的時候,都只需要改一下頭檔案就行了,而不需要標頭檔案原始檔都更改,減少了工作量和出錯率。

全域性變數在標頭檔案中「定義」

看著標題,定義上面加了乙個引號,這個得注意了。怎麼解釋呢,一般而言,變數只能定義在.c檔案中,宣告變數才在.h檔案中。下面就打破常規,把定義變數的語句放在.h檔案中,但是對實際而言,變數定義在標頭檔案中是表面上的。下面直接給出 有三個檔案a.h a.c main.c a.h裡面的 csharp vi...

標頭檔案中用static定義全域性變數的問題

cocos3.13前的版本中,一些全域性變數使用static 定義,研究了static定義全域性變數的優缺點。例如定義下面的標頭檔案 pragma once static int globle 0 static int image 省略 在其他原始檔中,引用cocos.h標頭檔案後,每個原始檔都會儲...

C語言中定義全域性變數

1 在c語言的標頭檔案中定義變數出現的問題 最好不要傻嘻嘻的在標頭檔案裡定義什麼東西。比如全域性變數 xx標頭檔案 ifndef xx 標頭檔案.h define xx 標頭檔案.h int a endif 那麼,很糟糕的是,這裡的int a 是個全域性變數的定義,所以如果這個標頭檔案被多次引用的話...