找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1446|回復(fù): 10
收起左側(cè)

C語(yǔ)言extern問題 不太明白請(qǐng)教下大家

[復(fù)制鏈接]
ID:1000365 發(fā)表于 2022-1-22 17:10 | 顯示全部樓層 |閱讀模式
本帖最后由 ty86391101 于 2022-1-22 18:46 編輯

這個(gè)是tftled.c
51hei截圖20220122170145.png
下面的是tftled.h
51hei截圖20220122170157.png 這個(gè)是 main.c
51hei截圖20220122184308.png
想問下 編譯的時(shí)候 這個(gè)數(shù)組和變量i 都需要加上 extern 才行,
為什么頭文件里,函數(shù)sum不需要前面加extern?


(函數(shù)沒什么意義 隨便寫的)
回復(fù)

使用道具 舉報(bào)

ID:624769 發(fā)表于 2022-1-22 18:04 | 顯示全部樓層
extern  是引用外部已經(jīng)聲明的變量
通常是在一個(gè)項(xiàng)目中引用另一個(gè) C 文件聲明的變量,所以理論上這個(gè) .h 文件應(yīng)該是被另一個(gè) C文件 include 而不是被這個(gè) C文件 include, 感覺上,這幾個(gè)文件,被不同的人修改過,而修改的人也是半吊子。
回復(fù)

使用道具 舉報(bào)

ID:908826 發(fā)表于 2022-1-22 18:33 | 顯示全部樓層
沙發(fā)正解
回復(fù)

使用道具 舉報(bào)

ID:1000365 發(fā)表于 2022-1-22 18:42 | 顯示全部樓層
188610329 發(fā)表于 2022-1-22 18:04
extern  是引用外部已經(jīng)聲明的變量
通常是在一個(gè)項(xiàng)目中引用另一個(gè) C 文件聲明的變量,所以理論上這個(gè) .h  ...

我修改一下哦,是沒給寫全  確實(shí)是別的函數(shù)去調(diào)用的
回復(fù)

使用道具 舉報(bào)

ID:879809 發(fā)表于 2022-1-22 19:27 | 顯示全部樓層
不加extern是定義變量,一個(gè)名字的全局變量在工程里面只能定義一次。加了extern是聲明變量,告訴c源碼別的文件定義了一個(gè)什么類型的變量,當(dāng)然可以在除了定義這個(gè)變量的c文件以外的任意c文件里面聲明變量,不管用沒用到。

函數(shù)原型聲明,原理同上。所以不需要加extern。
回復(fù)

使用道具 舉報(bào)

ID:1000365 發(fā)表于 2022-1-22 21:08 | 顯示全部樓層
發(fā)表于 2022-1-22 19:27
不加extern是定義變量,一個(gè)名字的全局變量在工程里面只能定義一次。加了extern是聲明變量,告訴c源碼別的 ...

是不是編譯器默認(rèn)的每個(gè)函數(shù)都是extern類型的?
所以函數(shù)不用加extern啊?
回復(fù)

使用道具 舉報(bào)

ID:879809 發(fā)表于 2022-1-22 21:21 | 顯示全部樓層
ty86391101 發(fā)表于 2022-1-22 21:08
是不是編譯器默認(rèn)的每個(gè)函數(shù)都是extern類型的?
所以函數(shù)不用加extern?

函數(shù)聲明只是聲明有這個(gè)東西,入口參數(shù)和出口參數(shù)都是什么樣子的,當(dāng)然可以每個(gè)c文件里面聲明。

類似函數(shù)聲明的變量的寫法是定義,定義這個(gè)變量,比如int i;是定義i這個(gè)int型變量,你要在多個(gè)c文件里面定義,那么連接的時(shí)候,連接器就不知道該用哪個(gè)i,就亂套了。

extern int i;才是變量聲明,聲明其他c文件定義的i變量。
回復(fù)

使用道具 舉報(bào)

ID:879809 發(fā)表于 2022-1-22 21:23 | 顯示全部樓層
補(bǔ)充一下,可以在多個(gè)c文件里面定義static int i;但是每個(gè)文件里面的i都是自己文件的,你永遠(yuǎn)無法訪問其他c文件里面的i,只能訪問自己文件里面的那個(gè)。
回復(fù)

使用道具 舉報(bào)

ID:1000365 發(fā)表于 2022-1-22 22:06 | 顯示全部樓層
發(fā)表于 2022-1-22 21:21
函數(shù)聲明只是聲明有這個(gè)東西,入口參數(shù)和出口參數(shù)都是什么樣子的,當(dāng)然可以每個(gè)c文件里面聲明。

類似 ...

嗯,我的矛盾點(diǎn)在于 你看啊

tftled.h這個(gè)頭文件里面 聲明的 變量和函數(shù)

在main.c這個(gè)文件使用 包含了tftled.h頭文件(include"tftled.h")

那么 我在main.c這個(gè)文件里面 想用tftled.c里的變量 這個(gè)需要聲明extern int i;到這邊我都是知道。

那main.c要去用tftled.c里的函數(shù)的時(shí)候 不也得是extern u8 sum();聲明一下嗎?

他不加extern 光聲明u8 sum(u8 a,u8 b); 也能找到tftled.c里的函數(shù)。不得是extern u8 sum(u8 a,u8 b);嗎?
回復(fù)

使用道具 舉報(bào)

ID:879809 發(fā)表于 2022-1-22 22:34 | 顯示全部樓層
ty86391101 發(fā)表于 2022-1-22 22:06
嗯,我的矛盾點(diǎn)在于 你看啊

tftled.h這個(gè)頭文件里面 聲明的 變量和函數(shù)
  1. extern int i;
復(fù)制代碼

這是聲明一個(gè)變量;
  1. int sum(int, int);
復(fù)制代碼

這是聲明一個(gè)函數(shù);
  1. int i;
復(fù)制代碼

這是定義一個(gè)變量;
  1. int sum(int x,int y){
  2.   return x+y;
  3. }
復(fù)制代碼

這是定義一個(gè)函數(shù);

聲明可以在任何用到的文件里面寫,定義在整個(gè)工程里面只能寫一次。
話已經(jīng)說到這種程度還看不懂,我無能為力了。
回復(fù)

使用道具 舉報(bào)

ID:160500 發(fā)表于 2022-1-22 23:09 | 顯示全部樓層
這個(gè)你要理解作用域的概念,看看書上怎么說的吧
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表