C語言中的頭文件能不能重復(fù)包含?
比如代碼寫成這樣,stdio.h 連續(xù)包含了兩次。
#include#include int main() { printf("helloworld "); return 0; }
我們先來編譯看下,好像沒有任何問題。
root@Turbo:~# gcc test.c -o test root@Turbo:~#
同一個頭文件,隨便包含多少次,都不會有問題,主要是這兩行代碼起了作用。
#ifndef _STDIO_H #define _STDIO_H 1
寫頭文件的時候,習慣上都會加上兩個預(yù)處理指令,ifndef 和 define。
就以這個 test.h 為例:
#ifndefTEST_H #define TEST_H struct Test { int a; }; #endif
在 test.h 里面聲明了一個結(jié)構(gòu)體,然后在源文件中包含了兩次。
頭文件往往在編譯的第一步,預(yù)處理的時候展開。
第一次展開 test.h 的時候,會遇到預(yù)處理指令 ifndef:
#ifndef TEST_H
翻譯過來就是如果沒有定義這個宏。
很顯然,這個宏確實沒有定義過,于是判斷成立。
繼續(xù)往下走,遇到 define:
#define TEST_H
意思就是把這個宏定義一下。
然后就是把 test.h 里面的內(nèi)容搬到源文件中,這就是所謂的展開。
第二次包含 test.h 的時候,重復(fù)上面的操作。
先是遇到 ifndef,很顯然,這個宏剛才定義過,于是這條預(yù)處理指令不成立,下面的所有代碼都會跳過。
這樣就清楚了,雖然我們在源碼里面包含了 test.h,但是因為判斷不成立,并沒有真正的包含進去。
相同的頭文件在一個源碼文件中可以重復(fù)包含,因為預(yù)處理指令的存在,所以并不會出問題。
-
C語言
+關(guān)注
關(guān)注
180文章
7614瀏覽量
137773 -
代碼
+關(guān)注
關(guān)注
30文章
4830瀏覽量
69090
原文標題:重復(fù)包含頭文件有什么影響
文章出處:【微信號:學益得智能硬件,微信公眾號:學益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論