一、標頭檔案
1. c++程式一般分為3部分:
標頭檔案、實現標頭檔案的原始檔、呼叫函式的原始檔
2. 標頭檔案常包含的內容
(1)函式原型
(2)使用#define或者const定義的符號常量
被宣告為const的資料具有特殊的鏈結屬性(外部/內部/無),具備的鏈結性為內部,其作用域為包含標頭檔案的當前原始檔(類似static,但const修飾的為常量,不可改變其值),不會出現多次定義的情況,所以可行
(3)結構宣告
(4)類宣告
(5)模板宣告
(6)內聯函式
注意:
(1)使用#include
來包含檔案,本質是將包含的檔案與源**合併,對於int global = 100
的外部變數只能被乙個檔案包含,所以不能放在標頭檔案(否則破壞單定義規則);
(2)不要使用#include
來包含源**檔案,這樣將導致多重宣告
(3)同乙個檔案只能將同乙個標頭檔案包含一次,建議使用
#ifndef test_h_
#define test_h_
.... // include的內容
#endif
二、儲存持續性、作用域和鏈結性
1. 儲存持續性
(1)自動儲存持續性
函式內定義,存在於函式內或者**塊
(2)靜態儲存持續性
函式外定義,static修飾,存在於程式執行週期
(3)執行緒儲存持續性
thread_local修飾,存在於執行緒生命週期
(4)動態儲存持續性
new分配,delete釋放,自由儲存或堆
2. 作用域和鏈結
int global = 100; // test1.cpp 函式外定義
在test2.cpp使用需(符合單定義規則)
extern int global ;
(2)內部
只能由乙個檔案中的函式共享
const int a = 100; // 函式外定義常量(不能修改值)
static int b = 100; // 函式外定義靜態變數
(3)無
不能共享,只能在函式或**塊中訪問
函式的鏈結性預設為外部的(即可在檔案間共享),儲存持續性為靜態的(存在於程式執行週期),所以不能同時在兩個檔案中定義乙個相同的函式(違反單定義)。在另外乙個cpp檔案中使用某個cpp檔案定義的函式時,可以通過#include引入標頭檔案或者直接在函式上面寫上要使用函式的宣告。
// main.cpp 檔案1
#include// 這裡只使用系統的標頭檔案
int add(int a, int b); // 直接在函式上面寫上要使用函式的宣告(實際上是extern int add(int a, int b);對於函式而言,extern 關鍵字可以省略)
int main()
// test.cpp 檔案2
int add(int a, int b)
二、命名空間
避免變數名稱發生衝突(預設情況下,在命名空間中宣告的變數鏈結性為外部的)
// test.h
#ifndef test_h_
#define test_h_
namespace jack1
namespace jack2
// main.cpp
#include#include"test.h"
int main()
// 等價main.cpp(因為jack1命名空間在"test.h"標頭檔案中引入了)
#include#include"test.h"
int main()
#endif
記憶體模型和命名空間
編譯器將分配固定的記憶體塊來儲存所有的靜態變數,這些變數在整個程式執行過程中一直存在。另外,如果沒有顯示的初始化靜態變數,編譯器將把它設為0,在預設情況下,靜態陣列和結構將每個元素或成員變數的所有位都設定為0 定義方式 1 外 必須在 塊的外面宣告它,可使用external修飾也可省略 2 內 必須...
記憶體模型和命名空間
include include coordin.h 尖括號 在標準標頭檔案中查詢 雙引號 先在當前g 先在當前工作目錄查詢 找不到,則去查詢標準標頭檔案 int x 在程式開始執行所屬的函式和 塊時建立 在執行完函式和 快時被釋放。register int x 變數儲存在暫存器中,因此不能通過位址來...
C 記憶體模型與命名空間
hpp檔案與.h檔案都是header檔案,但是.hpp檔案中包含了函式實現,減少了需要編譯的.cpp檔案數量。在ide中,不要將標頭檔案加入到專案列表中,只需源 標頭檔案由 include指令管理。為什麼.hpp中包括模板函式的實現,當該.hpp檔案被多個cpp用 include包含,鏈結時不會出現...