定義:
- 定義:為變量分配地址和存儲空間
- 聲明:不分配地址和存儲空間
一個變量可以在多個地方聲明,但是只在一個地方定義。加入extern修飾的是變量的聲明,說明此變量將在文件或在文件后面部分定義。
1.變量聲明
- 作用:告訴編譯器“這個變量存在”,并且說明它的類型和名字,但不分配存儲空間(特殊情況除外)。
- 特征:
? ? ? ? ? ? ?1.不創建內存,只是一個“公告”?
? ? ? ? ? ? ?2.常見于extern關鍵字修飾的變量
? ? ? ? ? ? ?3.典型使用場景:在頭文件 .h
中聲明,讓其他 .c
文件知道有這個變量。
- 示例:
extern int a; // 聲明,告訴編譯器 a 在別的地方定義過
2.變量定義
作用:真正創建變量,并分配內存空間,可以(也可以不)賦初值。
特征:
? ? ? ? ? ? ? 1.編譯器會為它分配存儲空間
? ? ? ? ? ? ? 2.一個變量在整個程序中只能被定義一次(全局變量)。
? ? ? ? ? ? ? 3.沒有extern,且位于函數體外部時,一般就是定義。
- 示例:
int a = 10; // 定義,分配空間,并賦初值 10
3.容易混淆的點
- 沒有
extern
的全局變量聲明就是定義:
int b; // 在全局范圍,這是定義(分配空間,默認初始化為0)
- 局部變量聲明就是定義(因為它會分配在棧上):
void func() {int c; // 局部變量,聲明同時定義
}
- 只有聲明,沒有定義的變量,必須在其他文件中有定義,否則鏈接時報錯。
4.總結對比表
對比項 | 聲明(Declaration) | 定義(Definition) |
---|---|---|
是否分配內存 | 否(除非是局部變量) | 是 |
是否初始化 | 否 | 可以初始化 |
是否唯一 | 可以多次聲明 | 在全局范圍只能有一次定義 |
常見關鍵字 | extern | 無 extern ,或帶初始化 |
場景 | 告訴編譯器變量存在 | 真正創建變量并分配空間 |
5.快速記憶
聲明是告訴編譯器“它有”,定義是告訴編譯器“它在這里”并給它空間。