C語言day10-02內(nèi)部全局變量和外部全局變量

pragma mark 內(nèi)部全局變量和外部全局變量

pragma mark 概念

/**
 默認(rèn)情況下所有的全局變量都是 外部全局變量
只要給全局變量加上 static 關(guān)鍵字 就是內(nèi)部全局變量
 
 外:多個(gè)同名的外部全局變量 指向 同一塊存儲空間
 內(nèi):多個(gè)同名的全局變量 如果不在同一個(gè)文件中,那么指向不同的存儲空間

 只要用static修改的全局變量就是內(nèi)部全局變量,只能在當(dāng)前文件中使用
 
 extern:
 用于聲明一個(gè)外部全局變量
 聲明只需要在使用變量之前聲明就可以了
 static:
 用于定義一個(gè)內(nèi)部全局變量
 聲明和定義的區(qū)別:
 聲明不會(huì)開辟存儲空間
 定義會(huì)開辟存儲空間
 
 */

pragma mark 代碼

mian.c

#include <stdio.h>
#include "lyh.h"
/*
 全局變量分為兩種:
 1.外部全局變量,默認(rèn)情況下所有的全局變量都是外部全局變量
    什么是外部全局變量? 可以被其他文件訪問的全局變量 我們稱之為 外部全局變量
 
 2. 內(nèi)部全局變量, 只要給全局變量加上 static 關(guān)鍵字 就是內(nèi)部全局變量
    什么是內(nèi)部全局變量? 只能被當(dāng)前文件訪問的全局變量 我們稱之為 內(nèi)部全局變量
 
 外部全局變量 有一個(gè)特點(diǎn):
    可以定義同名的外部全局變量
    多個(gè)同名的外部全局變量 指向 同一塊存儲空間
 
 內(nèi)部全局變量 又一個(gè)特點(diǎn):
    也可以定義多個(gè)同名的內(nèi)部全局變量
    多個(gè)同名的全局變量 如果不在同一個(gè)文件中,那么指向不同的存儲空間
 
 為了提高數(shù)據(jù)的安全性, 不讓別人在其他文件中修改我們的全局變量,C語言提供了另外一個(gè)用于修改全局變量的關(guān)鍵字,static
 // 只要用static修改的全局變量就是內(nèi)部全局變量,只能在當(dāng)前文件中使用
 這樣就可以提高我們?nèi)肿兞康陌踩? 
 如果多個(gè)文件中存在同名的 內(nèi)部全局變量,相互不影響
 如果既有外部全局變量 也有內(nèi)部全局變量, 那么會(huì)優(yōu)先訪問內(nèi)部全局變量
 
 extern:
    用于聲明一個(gè)外部全局變量
    聲明只需要在使用變量之前聲明就可以了
 static:
    用于定義一個(gè)內(nèi)部全局變量
 聲明和定義的區(qū)別:
    聲明不會(huì)開辟存儲空間
    定義會(huì)開辟存儲空間
 */

// 編譯 出現(xiàn) main.o
// 說我在 mian.c 里面定義了一個(gè)num

// int num; // 外部全局變量

static int num; // 內(nèi)部全局變量
int main()
{
    /*
     Undefined symbols for architecture x86_64:
     "_test", referenced from:
     _main in main.o
     ld: symbol(s) not found for architecture x86_64
     clang: error: linker command failed with exit code 1 (use -v to see invocation)
     
    找不到text函數(shù)
     
     */
    num = 998; 
    test();
    printf("main.c num = %i\n",num);

    return 0;
}


lyh.c

#include "lyh.h"
// duplicate symbol _num in: 說我重復(fù)定義了一個(gè)num

/*
// 編譯 出現(xiàn) lyh.o
// 說我在1 mian.c 里面定義了一個(gè)num
//int num;   // 由于Xcode6升級之后導(dǎo)致的,在Xcode6以前是可以的
 如果在lyh.c當(dāng)中 定義外部全局變量 num, 那么我們說過 同名的外部全局變量 指向同一塊存儲空間,那么如果在多個(gè)文件中有同名的外部全局變量,可能導(dǎo)致a文件的數(shù)據(jù)被B文件不小心修改
 降低了數(shù)據(jù)的封裝性,提高了錯(cuò)誤的風(fēng)險(xiǎn)
*/
// extern 關(guān)鍵字 用于修飾全局變量, 代表聲明一個(gè)全局變量
// 注意:聲明全局變量 和 聲明函數(shù) 一樣 , 僅僅是告訴系統(tǒng)我們有這個(gè)全局變量, 但并不會(huì)真正的開辟存儲空間
//extern int num;    // 如果使用命令行輸出 不會(huì)有問題 cc-c mian.c  cc - lyh.c 生成 .o文件 然后  cc mian.o lyh.o 生成a.out
/**
 Undefined symbols for architecture x86_64:
 "_num", referenced from:
 _test in lyh.o
 
 extern 是聲明一個(gè)變量, 而不是開辟一塊存儲空間
 */
//int num;
void test()
{
extern int num;
    printf("lyh.c num = %i\n",num);
    num = 666;
}
int num;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容