日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

《gcc五分钟系列》第六节:编译期符号检查

發布時間:2025/3/19 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《gcc五分钟系列》第六节:编译期符号检查 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

《gcc五分鐘系列》第六節:編譯期符號檢查

??? 上一節,我們說了從源文件到目標文件的編譯過程。這一節,我想討論一下編譯期符號檢查的問題。
??? 請原諒我實在不知道如何翻譯“reference”,“引用”似乎不能表達清楚,所以我擅自將它翻譯成“符號”。
??? 比如,第四節的例子中,main.cpp文件中只有sum()函數的聲明、而沒有定義。
??? 相信您能夠分辨C/C++中聲明和定義的區別。
??? 可是將main.cpp編譯成main.o的過程中,沒有報任何錯誤。
???
??? 這里,我們看下面這個例子:
??? 我們只聲明了一個結構體而沒有定義這個結構體,然后定義一個這個結構體的變量。
??? 代碼:

  • //struct1.cpp?
  • struct?Poo;?
  • int?main()?
  • {?
  • ????Poo?a;?
  • ????return?0;?
  • }?
  • ??? 只編譯而不鏈接:

  • g++?-c?struct1.cpp?
  • ??? 這個時候它會報錯:

  • struct1.cpp:?In?function?‘int?main()’:?
  • struct1.cpp:4:6:?error:?aggregate?‘Poo?a’?has?incomplete?type?and?cannot?be?defined?

  • ??? 這說明,只有聲明沒有定義的結構體不能夠定義變量。
    ??? 把代碼稍微改一下,定義這個結構體的一個指針:

  • //struct1.cpp?
  • struct?Poo;?
  • int?main()?
  • {?
  • ????Poo?*a;?
  • ????return?0;?
  • }?

  • ??? 只編譯不鏈接,沒有任何問題。

    ??? 這說明,雖然不能定義變量,但是可以定義指針。
    ??? 再把代碼稍微改一下,實例化一下:

  • //struct1.cpp?
  • struct?Poo;?
  • int?main()?
  • {?
  • ????Poo?*a=new?Poo;?
  • ????return?0;?
  • }?

  • ??? 這個時候也會報錯:

  • struct1.cpp:?In?function?‘int?main()’:?
  • struct1.cpp:4:13:?error:?invalid?use?of?incomplete?type?‘struct?Poo’?
  • struct1.cpp:1:8:?error:?forward?declaration?of?‘struct?Poo’?
  • ???
    ??? 根據我的經驗:
    ??? 1、編譯期不會報錯的幾種情況(鏈接期會不會報錯是另外一回事了,這里不討論):
    ??? ??? 1.1、調用一個只有聲明沒有定義的函數。
    ??? ??? 1.2、定義一個只有聲明沒有定義的類型的指針。
    ??? ??? 1.3、使用一個只有聲明沒有定義的變量。
    ??? ??? 變量如何只聲明不定義?int a;就已經是定義了。好吧,留個懸念,大家可以自己研究一下。
    ??? 2、編譯期會報錯的幾種情況:
    ??? ??? 2.1、定義一個只有聲明沒有定義的類型的變量。
    ??? ??? 2.2、實例化一個只有聲明沒有定義的類型。
    ??? ???
    ??? 這節好像稍微有點長,好吧。結束。

    轉載于:https://blog.51cto.com/elephantliu/652302

    總結

    以上是生活随笔為你收集整理的《gcc五分钟系列》第六节:编译期符号检查的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。