欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

C語言extern問題 不太明白請教下大家

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

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


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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

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

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

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

使用道具 舉報

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

使用道具 舉報

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

類似 ...

嗯,我的矛盾點在于 你看啊

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);嗎?
回復(fù)

使用道具 舉報

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

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

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

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

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

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

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

使用道具 舉報

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

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