久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1405|回復: 10
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
本帖最后由 ty86391101 于 2022-1-22 18:46 編輯

這個是tftled.c

下面的是tftled.h
這個是 main.c

想問下 編譯的時候 這個數組和變量i 都需要加上 extern 才行,
為什么頭文件里,函數sum不需要前面加extern?


(函數沒什么意義 隨便寫的)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:624769 發表于 2022-1-22 18:04 | 只看該作者
extern  是引用外部已經聲明的變量
通常是在一個項目中引用另一個 C 文件聲明的變量,所以理論上這個 .h 文件應該是被另一個 C文件 include 而不是被這個 C文件 include, 感覺上,這幾個文件,被不同的人修改過,而修改的人也是半吊子。
回復

使用道具 舉報

板凳
ID:908826 發表于 2022-1-22 18:33 | 只看該作者
沙發正解
回復

使用道具 舉報

地板
ID:1000365 發表于 2022-1-22 18:42 | 只看該作者
188610329 發表于 2022-1-22 18:04
extern  是引用外部已經聲明的變量
通常是在一個項目中引用另一個 C 文件聲明的變量,所以理論上這個 .h  ...

我修改一下哦,是沒給寫全  確實是別的函數去調用的
回復

使用道具 舉報

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

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

使用道具 舉報

6#
ID:1000365 發表于 2022-1-22 21:08 | 只看該作者
發表于 2022-1-22 19:27
不加extern是定義變量,一個名字的全局變量在工程里面只能定義一次。加了extern是聲明變量,告訴c源碼別的 ...

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

使用道具 舉報

7#
ID:879809 發表于 2022-1-22 21:21 | 只看該作者
ty86391101 發表于 2022-1-22 21:08
是不是編譯器默認的每個函數都是extern類型的啊?
所以函數不用加extern啊?

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

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

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

使用道具 舉報

8#
ID:879809 發表于 2022-1-22 21:23 | 只看該作者
補充一下,可以在多個c文件里面定義static int i;但是每個文件里面的i都是自己文件的,你永遠無法訪問其他c文件里面的i,只能訪問自己文件里面的那個。
回復

使用道具 舉報

9#
ID:1000365 發表于 2022-1-22 22:06 | 只看該作者
發表于 2022-1-22 21:21
函數聲明只是聲明有這個東西,入口參數和出口參數都是什么樣子的,當然可以每個c文件里面聲明。

類似 ...

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

tftled.h這個頭文件里面 聲明的 變量和函數

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

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

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

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

使用道具 舉報

10#
ID:879809 發表于 2022-1-22 22:34 | 只看該作者
ty86391101 發表于 2022-1-22 22:06
嗯,我的矛盾點在于 你看啊

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

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

這是聲明一個函數;
  1. int i;
復制代碼

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

這是定義一個函數;

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

使用道具 舉報

11#
ID:160500 發表于 2022-1-22 23:09 | 只看該作者
這個你要理解作用域的概念,看看書上怎么說的吧
回復

使用道具 舉報

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

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费观看av | 影音先锋中文在线 | 欧美成人免费在线 | 日韩视频一区二区三区 | www.久久.com | 亚洲高清成人 | 日本三级电影在线看 | 国产一区二区影院 | 国产一区二区免费 | 成人福利在线视频 | 毛片一区二区三区 | 久久精品欧美一区二区三区不卡 | 国产第一页在线观看 | 狠狠操网站 | 在线视频一区二区三区 | 91国内精品久久 | 天天干视频 | 亚洲最新在线视频 | 伦理二区| a级片在线观看 | 久久av综合| 蜜桃av一区二区三区 | 国产不卡视频在线 | 日本在线免费 | 国产一区二区三区四区区 | 成人免费av在线 | 精品中文字幕在线观看 | 国产成人精品免高潮在线观看 | 国产高清免费视频 | 国产91黄色| 欧美一区二区三区 | av天天看 | 伊大人久久 | 欧美一区 | 全免一级毛片 | 在线视频 中文字幕 | 久久精品91久久久久久再现 | 日韩一区二区三区视频在线观看 | 精品日韩一区二区 | 91久久国产综合久久 | 国产精品福利视频 |