pragma mark 內部全局變量和外部全局變量
pragma mark 概念
/**
默認情況下所有的全局變量都是 外部全局變量
只要給全局變量加上 static 關鍵字 就是內部全局變量
外:多個同名的外部全局變量 指向 同一塊存儲空間
內:多個同名的全局變量 如果不在同一個文件中,那么指向不同的存儲空間
只要用static修改的全局變量就是內部全局變量,只能在當前文件中使用
extern:
用于聲明一個外部全局變量
聲明只需要在使用變量之前聲明就可以了
static:
用于定義一個內部全局變量
聲明和定義的區別:
聲明不會開辟存儲空間
定義會開辟存儲空間
*/
pragma mark 代碼
mian.c
#include <stdio.h>
#include "lyh.h"
/*
全局變量分為兩種:
1.外部全局變量,默認情況下所有的全局變量都是外部全局變量
什么是外部全局變量? 可以被其他文件訪問的全局變量 我們稱之為 外部全局變量
2. 內部全局變量, 只要給全局變量加上 static 關鍵字 就是內部全局變量
什么是內部全局變量? 只能被當前文件訪問的全局變量 我們稱之為 內部全局變量
外部全局變量 有一個特點:
可以定義同名的外部全局變量
多個同名的外部全局變量 指向 同一塊存儲空間
內部全局變量 又一個特點:
也可以定義多個同名的內部全局變量
多個同名的全局變量 如果不在同一個文件中,那么指向不同的存儲空間
為了提高數據的安全性, 不讓別人在其他文件中修改我們的全局變量,C語言提供了另外一個用于修改全局變量的關鍵字,static
// 只要用static修改的全局變量就是內部全局變量,只能在當前文件中使用
這樣就可以提高我們全局變量的安全性
如果多個文件中存在同名的 內部全局變量,相互不影響
如果既有外部全局變量 也有內部全局變量, 那么會優先訪問內部全局變量
extern:
用于聲明一個外部全局變量
聲明只需要在使用變量之前聲明就可以了
static:
用于定義一個內部全局變量
聲明和定義的區別:
聲明不會開辟存儲空間
定義會開辟存儲空間
*/
// 編譯 出現 main.o
// 說我在 mian.c 里面定義了一個num
// int num; // 外部全局變量
static int num; // 內部全局變量
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函數
*/
num = 998;
test();
printf("main.c num = %i\n",num);
return 0;
}
lyh.c
#include "lyh.h"
// duplicate symbol _num in: 說我重復定義了一個num
/*
// 編譯 出現 lyh.o
// 說我在1 mian.c 里面定義了一個num
//int num; // 由于Xcode6升級之后導致的,在Xcode6以前是可以的
如果在lyh.c當中 定義外部全局變量 num, 那么我們說過 同名的外部全局變量 指向同一塊存儲空間,那么如果在多個文件中有同名的外部全局變量,可能導致a文件的數據被B文件不小心修改
降低了數據的封裝性,提高了錯誤的風險
*/
// extern 關鍵字 用于修飾全局變量, 代表聲明一個全局變量
// 注意:聲明全局變量 和 聲明函數 一樣 , 僅僅是告訴系統我們有這個全局變量, 但并不會真正的開辟存儲空間
//extern int num; // 如果使用命令行輸出 不會有問題 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 是聲明一個變量, 而不是開辟一塊存儲空間
*/
//int num;
void test()
{
extern int num;
printf("lyh.c num = %i\n",num);
num = 666;
}
int num;
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。