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