您好,登錄后才能下訂單哦!
這篇文章主要介紹了C語言函數的溯源是什么的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇C語言函數的溯源是什么文章都會有所收獲,下面我們一起來看看吧。
面向過程是一種以過程為中心的編程思想
首先將復雜的問題分解為一個個容易解決的問題
分解過后的問題可以按照步驟一步步完成
函數是面向過程在 C 語言中的體現
解決問題的每個步驟可以用函數來實現
聲明的意義在于告訴編譯器程序單元的存在
定義則明確指示程序單元的意義
C 語言中通過 extern 進行程序單元的聲明
一些程序單元在聲明時可以省略 extern
嚴格意義上的聲明和定義并不相同!
下面看一個例子:
test.c:
#include <stdio.h> #include <malloc.h> extern int g_var; //聲明 extern struct Test; //聲明 int main() { extern void f(int i, int j); //聲明 extern int g(int x); //聲明 struct Test* p = NULL; // (struct Test*)malloc(sizeof(struct Test)); printf("p = %p\n", p); //g_var = 10; printf("g_var = %d\n", g_var); f(1, 2); printf("g(3) = %d\n", g(3)); free(p); return 0; }
global.c:
#include <stdio.h> /*下面都是定義*/ int g_var = 10; struct Test { int x; int y; }; void f(int i, int j) { printf("i + j = %d\n", i + j); } int g(int x) { return (int)(2 * x + g_var); }
輸出結果如下:
怎么證明聲明和定義不同呢?我們對 test.c 修改成這樣,將 struct Test* p = NULL; 改成 struct Test* p = (struct Test*)malloc(sizeof(struct Test));
#include <stdio.h> #include <malloc.h> extern int g_var; extern struct Test; int main() { extern void f(int i, int j); extern int g(int x); struct Test* p = (struct Test*)malloc(sizeof(struct Test)); printf("p = %p\n", p); //g_var = 10; printf("g_var = %d\n", g_var); f(1, 2); printf("g(3) = %d\n", g(3)); free(p); return 0; }
可以看到,直接報錯:
delphi@delphi-vm:~$ gcc test.c global.c
test.c:6: warning: useless storage class specifier in empty declaration
test.c: In function ‘main’:
test.c:13: error: invalid application of ‘sizeof’ to incomplete type ‘struct Test’
這是因為編譯器在 test.c 是找不到 struct Test 的定義的,只有 struct Test 的聲明,因此無法知道 struct Test 結構體的信息。(C 語言編譯器編譯 C 文件的時候不會依賴于文件之間的編譯順序)。
關于“C語言函數的溯源是什么”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“C語言函數的溯源是什么”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。