c 記憶體模型和命名空間

2021-10-01 05:01:53 字數 2013 閱讀 9178

一、標頭檔案

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包含,鏈結時不會出現...