【編程好習慣】永遠將頭文件做爲定義和引用的橋樑

在現實項目中,有時爲了省事在引用一個變量或函數時,會直接採用extern關鍵定在.c文件中進行聲明。圖1中reference.c的第3行是對一個變量採用extern關鍵字進行聲明,圖2中reference.c的第1行則是對一個函數採用extern關鍵字進行聲明。
define.c

00001: char g_name [] = {’Y’, ’u’, ’n’, ’\0’};編程

reference.c 數組

00001: #include <stdio.h> ide

00002: 函數

00003: extern char *g_name; spa

00004: 指針

00005: int main () orm

00006: { blog

00007:     printf ("%c\n", g_name [0]); ip

00008:     return 0; get

00009: }

圖1
define.c

00001: #include <stdio.h>

00002:

00003: void foo (const char *_p_arg1, const char *_p_arg2)

00004: {

00005:     printf ("%s,%s\n", _p_arg1, _p_arg2);

00006: }

reference.c

00001: extern void foo (int, const char *_p_arg);

00002:

00003: int main ()

00004: {

00005:     foo (-1, "Haha!");

00006:     return 0;

00007: }

圖2
經過使用圖3所示的命令分別編譯圖1和圖2中的代碼並運行之,讀者將發現兩個程序都將出現崩潰的結果。其緣由就是變量的真實定義與被引用時的聲明出現了不匹配,《 混淆指針和數組所致使的錯誤 》一文對這類問題進行了分析,以及解釋了爲何編譯器發現不了這類問題。

yunli.blog.51cto.com~

$gcc -g define.c reference.c -o example.exe

圖3

爲了杜絕相似事情的發生,須要經過使用頭文件來做爲變量或是函數的定義和引用的橋樑。圖4和圖5是分別採用頭文件的實現方式。兩個實現各自都定義了一個define.h頭文件用於聲明變量或是函數的原型,接着在define.c和reference.c中都包含這一頭文件。若是採用圖3所示的命令再一次編譯兩個程序,些時編譯器將報錯。
define.h

00001: extern char *g_name;

define.c

00001: #include 」define.h」

00002:

00003: char g_name [] = {’Y’, ’u’, ’n’, ’\0’};

reference.c

00001: #include <stdio.h>

00002: #include 」define.h」

00003:

00004: int main ()

00005: {

00006:     printf ("%c\n", g_name [0]);

00007:     return 0;

00008: }

圖4
define.h

00001: extern void foo (int, const char *_p_arg);

define.c

00001: #include <stdio.h>

00002: #include 」define.h」

00003:

00004: void foo (const char *_p_arg1, const char *_p_arg2)

00005: {

00006:     printf ("%s,%s\n", _p_arg1, _p_arg2);

00007: }

reference.c

00001: #include 」define.h」

00002:

00003: int main ()

00004: {

00005:     foo (-1, "Haha!");

00006:     return 0;

00007: }

圖5

在項目中之因此會出現直接採用extern進行外部變量或函數的引用,無非存在兩種緣由。其一是圖省事;其二則是因爲項目中的頭文件規劃得太亂,以致於要包含一個頭文件會引入更多其它沒完沒了的頭文件須要包含,固然其本質仍是圖省事。要使得項目組作到永遠採用將頭文件做爲定義和引用的橋樑,必須作到整個項目中的頭文件都組織得能夠被方便的包含,而要作到這一點,必須運用《 精確包含頭文件》這一編程好習慣。
相關文章
相關標籤/搜索