![]() |
發(fā)布時間: 2022-1-22 17:10
正文摘要:本帖最后由 ty86391101 于 2022-1-22 18:46 編輯 這個是tftled.c 想問下 編譯的時候 這個數(shù)組和變量i 都需要加上 extern 才行, 為什么頭文件里,函數(shù)sum不需要前面加extern? (函數(shù)沒什么意義 隨便 ... |
這個你要理解作用域的概念,看看書上怎么說的吧 |
ty86391101 發(fā)表于 2022-1-22 22:06
這是聲明一個變量;
這是聲明一個函數(shù);
這是定義一個變量;
這是定義一個函數(shù); 聲明可以在任何用到的文件里面寫,定義在整個工程里面只能寫一次。 話已經(jīng)說到這種程度還看不懂,我無能為力了。 |
發(fā)表于 2022-1-22 21:21 嗯,我的矛盾點在于 你看啊 tftled.h這個頭文件里面 聲明的 變量和函數(shù) 在main.c這個文件使用 包含了tftled.h頭文件(include"tftled.h") 那么 我在main.c這個文件里面 想用tftled.c里的變量 這個需要聲明extern int i;到這邊我都是知道。 那main.c要去用tftled.c里的函數(shù)的時候 不也得是extern u8 sum();聲明一下嗎? 他不加extern 光聲明u8 sum(u8 a,u8 b); 也能找到tftled.c里的函數(shù)。不得是extern u8 sum(u8 a,u8 b);嗎? |
補充一下,可以在多個c文件里面定義static int i;但是每個文件里面的i都是自己文件的,你永遠無法訪問其他c文件里面的i,只能訪問自己文件里面的那個。 |
ty86391101 發(fā)表于 2022-1-22 21:08 函數(shù)聲明只是聲明有這個東西,入口參數(shù)和出口參數(shù)都是什么樣子的,當然可以每個c文件里面聲明。 類似函數(shù)聲明的變量的寫法是定義,定義這個變量,比如int i;是定義i這個int型變量,你要在多個c文件里面定義,那么連接的時候,連接器就不知道該用哪個i,就亂套了。 extern int i;才是變量聲明,聲明其他c文件定義的i變量。 |
發(fā)表于 2022-1-22 19:27 是不是編譯器默認的每個函數(shù)都是extern類型的啊? 所以函數(shù)不用加extern啊? |
不加extern是定義變量,一個名字的全局變量在工程里面只能定義一次。加了extern是聲明變量,告訴c源碼別的文件定義了一個什么類型的變量,當然可以在除了定義這個變量的c文件以外的任意c文件里面聲明變量,不管用沒用到。 函數(shù)原型聲明,原理同上。所以不需要加extern。 |
188610329 發(fā)表于 2022-1-22 18:04 我修改一下哦,是沒給寫全 確實是別的函數(shù)去調(diào)用的 |
沙發(fā)正解![]() |
extern 是引用外部已經(jīng)聲明的變量 通常是在一個項目中引用另一個 C 文件聲明的變量,所以理論上這個 .h 文件應(yīng)該是被另一個 C文件 include 而不是被這個 C文件 include, 感覺上,這幾個文件,被不同的人修改過,而修改的人也是半吊子。 |
Powered by 單片機教程網(wǎng)