C 記憶體模型與命名空間

2021-08-31 20:44:35 字數 1645 閱讀 5964

.hpp檔案與.h檔案都是header檔案,但是.hpp檔案中包含了函式實現,減少了需要編譯的.cpp檔案數量。在ide中,不要將標頭檔案加入到專案列表中,只需源**,標頭檔案由#include指令管理。

為什麼.hpp中包括模板函式的實現,當該.hpp檔案被多個cpp用#include包含,鏈結時不會出現函式的重定義?以opencv core模組中cmdparser為例,core.hpp中實現了模板函式get(),core.hpp被precomp.hpp包含,而cmdparser.cpp中又包含了precomp.hpp,則編譯鏈結庫時,cmdparser.cpp中定義了get()。那麼當我建立乙個visual studio控制台工程,在main.cpp中#include 「core.hpp」,則再次定義了cmdparser的get(),為什麼鏈結時不會報錯呢?

因為模板宣告不是將被編譯的**,它們指示編譯器如何生成與源**中的函式呼叫相匹配的函式定義。hpp檔案中可以出現的:

函式原型

使用#define定義的巨集

結構宣告、類宣告

模板函式

內聯函式

使用const定義的符號常量

定義函式或變數時,如果是內部鏈結屬性,則可以在多個cpp檔案中定義。如下述3個靜態變數,global,one_file和count在整個程式執行期間都存在,未被初始化的靜態變數預設採用0初始化。總結static的兩種用法:用於區域性變數表示存貯持續性,放在固定的記憶體塊裡;用於**外的宣告表示內部鏈結性,變數已經是儲存持續的了。

int global =100;	//整個檔案均可訪問,鏈結性為外部,如果在另乙個檔案裡也定義global,則報錯

static int one_file = 50; //整個檔案可訪問,鏈結性為內部

void fun()

const全域性變數的鏈結性也是內部。因此在函式外定義的常量,在多個cpp檔案中被定義,不會出現重定義錯誤。預設情況下,函式的鏈結性為外部,想讓函式只能在乙個檔案中使用,需要對函式的定義和原型使用static關鍵字,通常就合在一起寫了。在定義靜態函式的檔案中,靜態函式將覆蓋外部定義。內聯函式可以在程式中多次定義,只要這些定義相同,因此內聯函式的定義也可以放在標頭檔案中。對於類中的函式,貌似應當把內聯函式和模板函式的實現放在hpp中,其它函式放在cpp中

namespace jill

char fetch;

int main()

與使用using namespace 相比較

namespace jill

char fetch;

int main()

int foo()

namespace myth

std::cin>>myth::fetch;

std::cout《結論:多使用using jill,少在函式裡用using namespace jill,不在函式之外用using namespace jill。不要在標頭檔案中使用using namespace jill,否則包含標頭檔案的順序可能會影響程式的行為,而且掩蓋了要讓哪些名稱可用。老式標頭檔案,如iostream.h沒有用到命名空間,但是新標頭檔案iostream使用了std命名空間。

c 記憶體模型和命名空間

一 標頭檔案 1.c 程式一般分為3部分 標頭檔案 實現標頭檔案的原始檔 呼叫函式的原始檔 2.標頭檔案常包含的內容 1 函式原型 2 使用 define或者const定義的符號常量 被宣告為const的資料具有特殊的鏈結屬性 外部 內部 無 具備的鏈結性為內部,其作用域為包含標頭檔案的當前原始檔 ...

C 記憶體與命名空間

假設頭檔名稱為zmyyq.h ifndef zmyyq h endif作用域和鏈結 自動變數的初始化 可以使用任何在宣告時其值為已知的表示式來初始化自動變數。由於自動變數的數目隨函式的開始和結束而增減,因此程式必須在執行時對自動變數進行管理。棧 總結各個區 動態儲存區 堆 動態分配 動態儲存區 棧 ...

記憶體模型和命名空間

編譯器將分配固定的記憶體塊來儲存所有的靜態變數,這些變數在整個程式執行過程中一直存在。另外,如果沒有顯示的初始化靜態變數,編譯器將把它設為0,在預設情況下,靜態陣列和結構將每個元素或成員變數的所有位都設定為0 定義方式 1 外 必須在 塊的外面宣告它,可使用external修飾也可省略 2 內 必須...