static和extern

1.extern??

? extern 是?來聲明外部符號的,如果?個全局的符號在A?件中定義的,在B?件中想使?,就可以使? extern 進?聲明,然后使?。
? 即在一個源文件中想要使用另一個源文件,即可通過這個extern來聲明使用。

2.static

??static 是 靜態的 的意思,可以?來:

? 修飾局部變量

? 修飾全局變量

? 修飾函數
在講解 static extern 之前再講?下:作?域和?命周期。
作用域(scope)是程序設計概念,通常來說,?段程序代碼中所?到的名字并不總是有效(可?)的,?限定這個名字的可?性的代碼范圍就是這個名字的作?域。
1. 局部變量的作?域是變量所在的局部范圍。
2. 全局變量的作?域是整個?程(項?)。
?命周期指的是變量的創建(申請內存)到變量的銷毀(收回內存)之間的?個時間段。
1. 局部變量的?命周期是:進?作?域變量創建,?命周期開始,出作?域?命周期結束。
2. 全局變量的?命周期是:整個程序的?命周期。

A.static 修飾局部變量:

//代碼1 #include <stdio.h>
void test()
{int i = 0;i++;printf("%d ", i);
}
int main()
{int i = 0;for(i=0; i<5; i++){test();}return 0; }
//代碼2 #include <stdio.h>
void test()
{//static修飾局部變量static int i = 0;i++;printf("%d ", i);
}
int main()
{int i = 0;for(i=0; i<5; i++){test();}return 0; }
? 對?代碼1和代碼2的效果,理解 static 修飾局部變量的意義。
? 代碼1的test函數中的局部變量i是每次進?test函數先創建變量(?命周期開始)并賦值為0,然后
++,再打印,出函數的時候變量?命周期將要結束(釋放內存)。
? 代碼2中,我們從輸出結果來看,i的值有累加的效果,其實 test函數中的i創建好后,出函數的時候是不會銷毀的,重新進?函數也就不會重新創建變量,直接上次累積的數值繼續計算。
?這里我們可以了解一下內存,下面是我的獨家筆記哦:
?
? 結論:static修飾局部變量改變了變量的?命周期,?命周期改變的本質是改變了變量的存儲類型,本來?個局部變量是存儲在內存的棧區的,但是被 static 修飾后存儲到了靜態區。存儲在靜態區的變 量和全局變量是?樣的,?命周期 就和程序的?命周期?樣了,只有程序結束,變量才銷毀,內存才 回收。但是作?域不變的。
? 使?建議:未來?個變量出了函數后,我們還想保留值,等下次進?函數繼續使?,就可以使?static修飾。

B.static修飾全局變量

這里是在一個大文件中有多個源文件

?代碼1

add.c

int g_val = 2018;

test.c

#include <stdio.h>
extern int g_val;
int main()
{printf("%d\n", g_val);return 0;
}

?代碼2

add.c

static int g_val = 2018;

test.c

#include <stdio.h>
extern int g_val;
int main()
{printf("%d\n", g_val);return 0;
}

? 對比上述兩個不同的代碼,我們可以得到結論:

? ?個全局變量被static修飾,使得這個全局變量只能在本源?件內使?,不能在其他源?件內使?。 本質原因是全局變量默認是具有外部鏈接屬性的,在外部的?件中想使?,只要適當的聲明就可以使?;但是全局變量被 static 修飾之后,外部鏈接屬性就變成了內部鏈接屬性,只能在??所在的源?件內部使?了,其他源?件,即使聲明了,也是?法正常使?的。
? 使?建議:如果?個全局變量,只想在所在的源?件內部使?,不想被其他?件發現,就可以使?static修飾。

C.static 修飾函數

? static 修飾函數與修飾全局變量是一樣的道理的。

代碼1

add.c

int Add(int x, int y)
{return x+y;
}

test.c

#include <stdio.h>
extern int Add(int x, int y);
int main()
{printf("%d\n", Add(2, 3));return 0; }

代碼2

add.c

static int Add(int x, int y)
{return x+y;
}

test.c

#include <stdio.h>
extern int Add(int x, int y);
int main()
{printf("%d\n", Add(2, 3));return 0; }

? 對比運行結果有:代碼1是能夠正常運?的,但是代碼2就出現了鏈接錯誤。

結論:

? 其實 static 修飾函數和 static修飾全局變量是?模?樣的,?個函數在整個?程都可以使?,
被static修飾后,只能在本?件內部使?,其他?件?法正常的鏈接使?了。 本質是因為函數默認是具有外部鏈接屬性,具有外部鏈接屬性,使得函數在整個?程中只要適當的聲明就可以被使?。但是被 static 修飾后變成了內部鏈接屬性,使得函數只能在??所在源?件內部使?。
? 使?建議:?個函數只想在所在的源?件內部使?,不想被其他源?件使?,就可以使? static 修飾。

小筆記:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/160086.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/160086.shtml
英文地址,請注明出處:http://en.pswp.cn/news/160086.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

未來制造業的新引擎:工業機器人控制解決方案

制造業正經歷著一場革命性的變革 在這個變革的浪潮中&#xff0c;工業機器人成為推動制造業高效生產的關鍵力量。然而&#xff0c;要發揮機器人的最大潛力&#xff0c;一個強大而智能的控制系統是必不可少的。在這個領域&#xff0c;新一代的工業機器人控制解決方案正嶄露頭角&…

學習MySQL先有全局觀,細說其發展歷程及特點

學習MySQL先有全局觀&#xff0c;細說其發展歷程及特點 一、枝繁葉茂的MySQL家族1. 發展歷程2. 分支版本 二、特點分析1. 常用數據庫2. 選型角度及場景 三、三大組成部分四、總結 相信很多同學在接觸編程之初&#xff0c;就接觸過數據庫&#xff0c;而對于其中關系型數據庫中的…

這樣寫postman實現參數化,阿里p8都直呼牛逼

什么時候會用到參數化 比如&#xff1a;一個模塊要用多組不同數據進行測試 驗證業務的正確性 Login模塊&#xff1a;正確的用戶名&#xff0c;密碼 成功&#xff1b;錯誤的用戶名&#xff0c;正確的密碼 失敗 postman實現參數化 在實際的接口測試中&#xff0c;部分參數…

你的關聯申請已發起,請等待企業微信的管理員確認你的申請

微信支付對接時&#xff0c;需要申請AppID,具體在下面的位置&#xff1a; 關聯AppID&#xff0c;發起申請時&#xff0c;會提示這么一句話&#xff1a; 此時需要登錄企業微信網頁版&#xff0c;使用注冊人的企業微信掃碼登錄進去&#xff0c;然后按照下面的步驟操作即可。 點擊…

iEnglish全國ETP大賽:教育游戲助力英語習得

“seesaw,abacus,sword,feather,frog,lion,mouse……”11月18日,經過3局的激烈較量,“以過客之名隊”的胡玲、黃長翔、林家慷率先晉級“玩轉英語,用iEnglish”第三屆全國ETP大賽的16強,在過去的周末中,還有TIK徘徊者隊、不負昭華隊、溫柔殺戮者隊先后晉級。據悉,根據活動規則,在…

電腦內存升級

ddr代兼容 自從DDR內存時代開啟之后&#xff0c;只要滿足內存的插槽規格相同(DDR3或DDR4或DDR5即為內存規格)這一條件&#xff0c;不同品牌、不同頻率以及不同容量的茶品都可以一起使用&#xff0c;除了品牌和容量的影響之外&#xff0c;不同頻率的搭配可能會造成性能方面的影…

面試官:什么是三色標記

程序員的公眾號&#xff1a;源1024&#xff0c;獲取更多資料&#xff0c;無加密無套路&#xff01; 最近整理了一波電子書籍資料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虛擬機》&#xff0c;《重構改善既有代碼設計》&#xff0c;《MySQL高性能-第3版》&…

git提交時會將target也提交

有時候大家在提交git時發現會將編譯文件target也提交上去&#xff0c;這種情況有以下幾種情況 情況1&#xff1a;項目沒有設置.gitignore 情況2&#xff1a;設置了.gitignore但是依然會提交。 第一種&#xff1a;添加.gitignore&#xff0c;并在文件中添加需要忽略的東西。 …

redis分布式鎖的學習記錄

核心性質 獨占性&#xff1a;對于同一把鎖&#xff0c;同一時刻只能被一個加鎖方獨占 健壯性&#xff1a;不能產生死鎖。如果有一個因為宕機無法主動解鎖&#xff0c;鎖也應該被正常加載 對稱性&#xff1a;加成和解鎖的使用方必須為同一個身份&#xff0c;不允許被非方釋放 高…

HCIA-實驗命令基礎學習:

視頻學習&#xff1a; 第一部分&#xff1a;基礎學習。 19——子網掩碼。 27——防火墻配置&#xff1a; 32——企業級路由器配置&#xff1a; 基礎實驗完成&#xff1a;&#xff08;完成以下目錄對應的實驗&#xff0c;第一部分基礎實驗就完成。&#xff09; 方法&#xff…

C //習題 8.13 寫一個用矩形法求定積分的通用函數,分別求

C程序設計 &#xff08;第四版&#xff09; 譚浩強 習題8.13 習題 8.13 寫一個用矩形法求定積分的通用函數&#xff0c;分別求 ∫ 0 1 s i n x d x &#xff0c; ∫ 0 1 c o s x d x &#xff0c; ∫ 0 1 e x d x \int_{0}^{1}sinx\ dx&#xff0c;\ \ \int_{0}^{1}cosx\ …

ILI9225 TFT顯示屏16位并口方式驅動

所用屏及資料如后圖&#xff1a; ILI9225&#xff0c;176*220&#xff0c;8位或16位并口屏&#xff0c;IM0接GND&#xff0c;電源及背光接3.3v 主控&#xff1a;CH32V307驅動&#xff08;庫文件和STM32基本一樣&#xff09; 一、源碼 ILI9225.c #include "ILI9225.h&quo…

設計模式(二)-創建者模式(4)-原型模式

一、為何需要原型模式&#xff08;Prototype Pattern&#xff09;? 在軟件設計中&#xff0c;我們會遇到到這樣的情況&#xff1a;對原對象進行拷貝一個新的副本。想要實現這樣的邏輯&#xff0c;有一種笨方法就是對原對象里的所有變量進行逐一賦值。但是這樣的做法會導致代碼…

【SpringCloud】認識微服務、服務拆分以及遠程調用

SpringCloud 1.認識微服務 1.1單體架構 單體架構&#xff1a;將業務的所有功能集中在一個項目中開發&#xff0c;打成一個包部署 單體架構的優缺點&#xff1a; **優點&#xff1a;**架構簡單&#xff0c;部署成本低 **缺點&#xff1a;**耦合度高&#xff08;維護困難&…

【C++】郭老二博文之:C++目錄

1、POCO 【POCO】POCO學習總結&#xff08;一&#xff09;–下載與編譯 【POCO】POCO學習總結&#xff08;二&#xff09;——配置選擇 【POCO】POCO學習總結&#xff08;三&#xff09;——交叉編譯 2、C11 2.1 STL算法 【C】C11 STL算法(一)&#xff1a;非修改序列操作&a…

筆記59:序列到序列學習Seq2seq

本地筆記地址&#xff1a;D:\work_file\&#xff08;4&#xff09;DeepLearning_Learning\03_個人筆記\3.循環神經網絡\第9章&#xff1a;動手學深度學習~現代循環神經網絡 a a a a a a a a a a a a a a a

C++ Day04 this指針,友元函數,重載

this指針 概念 誰調用 this 所在的函數 ,this 就存儲誰的地址 特點 1, 在當前類的非靜態成員函數中調用本類非靜態成員時 , 默認有 this 關鍵字 2, 靜態成員函數 , 沒有 this 指針。 示例 #include <iostream> #include <cstring> using namespace std; class S…

前后端分離項目跨域請求的問題與解決辦法

目錄 一、為什么會存在跨域請求&#xff1f; 二、跨域請求的流程&#xff1f; 三、什么情況下會觸發CROS機制&#xff1f; 四、如何解決跨域請求導致的問題&#xff1f; 一、為什么會存在跨域請求&#xff1f; 跨域請求是因為瀏覽器的同源策略引起的。同源策略是瀏覽器的一種…

算法刷題-動態規劃2

算法刷題-動態規劃2 珠寶的最高價值下降路徑最小和 珠寶的最高價值 題目 大佬思路 多開一行使得代碼更加的簡潔 移動到右側和下側 dp[ i ][ j ]有兩種情況&#xff1a; 第一種是從上面來的禮物最大價值&#xff1a;dp[ i ][ j ] dp[ i - 1 ][ j ] g[ i ][ j ] 第二種是從左…