《gcc五分钟系列》第六节:编译期符号检查
《gcc五分鐘系列》第六節(jié):編譯期符號(hào)檢查
??? 上一節(jié),我們說了從源文件到目標(biāo)文件的編譯過程。這一節(jié),我想討論一下編譯期符號(hào)檢查的問題。
??? 請(qǐng)?jiān)徫覍?shí)在不知道如何翻譯“reference”,“引用”似乎不能表達(dá)清楚,所以我擅自將它翻譯成“符號(hào)”。
??? 比如,第四節(jié)的例子中,main.cpp文件中只有sum()函數(shù)的聲明、而沒有定義。
??? 相信您能夠分辨C/C++中聲明和定義的區(qū)別。
??? 可是將main.cpp編譯成main.o的過程中,沒有報(bào)任何錯(cuò)誤。
???
??? 這里,我們看下面這個(gè)例子:
??? 我們只聲明了一個(gè)結(jié)構(gòu)體而沒有定義這個(gè)結(jié)構(gòu)體,然后定義一個(gè)這個(gè)結(jié)構(gòu)體的變量。
??? 代碼:
??? 只編譯而不鏈接:
??? 這個(gè)時(shí)候它會(huì)報(bào)錯(cuò):
??? 這說明,只有聲明沒有定義的結(jié)構(gòu)體不能夠定義變量。
??? 把代碼稍微改一下,定義這個(gè)結(jié)構(gòu)體的一個(gè)指針:
??? 只編譯不鏈接,沒有任何問題。
??? 這說明,雖然不能定義變量,但是可以定義指針。
??? 再把代碼稍微改一下,實(shí)例化一下:
??? 這個(gè)時(shí)候也會(huì)報(bào)錯(cuò):
???
??? 根據(jù)我的經(jīng)驗(yàn):
??? 1、編譯期不會(huì)報(bào)錯(cuò)的幾種情況(鏈接期會(huì)不會(huì)報(bào)錯(cuò)是另外一回事了,這里不討論):
??? ??? 1.1、調(diào)用一個(gè)只有聲明沒有定義的函數(shù)。
??? ??? 1.2、定義一個(gè)只有聲明沒有定義的類型的指針。
??? ??? 1.3、使用一個(gè)只有聲明沒有定義的變量。
??? ??? 變量如何只聲明不定義?int a;就已經(jīng)是定義了。好吧,留個(gè)懸念,大家可以自己研究一下。
??? 2、編譯期會(huì)報(bào)錯(cuò)的幾種情況:
??? ??? 2.1、定義一個(gè)只有聲明沒有定義的類型的變量。
??? ??? 2.2、實(shí)例化一個(gè)只有聲明沒有定義的類型。
??? ???
??? 這節(jié)好像稍微有點(diǎn)長,好吧。結(jié)束。
轉(zhuǎn)載于:https://blog.51cto.com/elephantliu/652302
總結(jié)
以上是生活随笔為你收集整理的《gcc五分钟系列》第六节:编译期符号检查的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 记一次SQL Server2005导入O
- 下一篇: 一起谈.NET技术,Silverligh