【C语言进阶深度学习记录】三十八 C/C++语言中的函数声明与函数定义
文章目錄
- 1 函數的聲明和定義
- 1.1 代碼分析
- 2 總結
1 函數的聲明和定義
- 聲明的意義在于告訴編譯器程序單元的存在。只是告訴編譯器它存在但是不在聲明這里定義,有可能在當前文件中的其他地方或者其他文件中定義。如果在它還沒有被定義之前就使用它,會導致編譯錯誤
- 定義則明確表示程序單元的意義
- C語言中,通過關鍵字extern進行程序單元的聲明。現在的編譯器可以省略不寫,大多時候都是直接省略。
注意:在C語言中,當有多個源文件的時候,編譯器共同編譯這些源文件的順序是不確定的。有可能先編譯A文件,也有可能先編譯B文件。這一點在下面的代碼中會有體現。
1.1 代碼分析
- 代碼 lyy.c
- global.c
分析:
上述代碼中,g_var和Test都是在global.c中定義的。在lyy.c中只是聲明。上述代碼編譯運行會是正確的結果。
- 問題1:
但是,如果將g_var在global.c中的定義改為:float g_var = 10;的話,再編譯運行上述代碼的結果就是打印g_var的值是一個很大的隨機值。這是為什么呢?
因為g_var 的定義是float類型,float類型在內存的存儲方式與int類型在內存的存儲方式是不一樣。具體參見float的內存存儲方式:【C語言進階深度學習記錄】三 浮點數(float) 在內存中的表示方法 .所以最終以int的方式打印g_var的時候,由于它本身在內存的存儲方式導致打印出一個很大的數。
- 問題2:
如果將lyy.c中的這一行:struct Test* p = NULL;改為:struct Test* p = (struct Test*)malloc(sizeof(struct Test)); 那么再次編譯程序就會報錯:
這個錯誤是說Test是不完整類型。為什么會這樣呢?在本文的剛開始已經說明:多個源文件一起編譯,各個源文件的編譯順序是不確定的。在這里,很明顯,在編譯lyy.c的13行的時候,使用了sizeof求解Test結構體的大小,但是Test結構體此時由于編譯器還沒有編譯到global.c,那么Test就是未定義的,根本無法使用sizeof求解它的大小所以編譯器報錯。
2 總結
- 聲明和定義是不同的
總結
以上是生活随笔為你收集整理的【C语言进阶深度学习记录】三十八 C/C++语言中的函数声明与函数定义的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SDM For Face Alignme
- 下一篇: 简单解说思科命令大全