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