複習9 原始檔和程式

2021-05-24 13:19:27 字數 1813 閱讀 7074

寫這篇文章之前要介紹命名空間和異常的。因為現在不常用它們,暫且略去。

9.1 分別編譯

原始檔提交給編譯器後,首先進行預處理,即完成巨集處理和按照#include指令引進標頭檔案。預處理之後的原始檔成為編譯單位--編譯器真正的工作物件。聯結器將分別編譯的部分約束在一起。

9.2 連線

如果乙個名字可以在定義它的編譯單位之外的其他編譯單位使用,稱其具有外部連線性。否則稱其具有內部連線性。

const,typedef,inline函式都是內部連線的。應該把全域性的這些東東放到標頭檔案中。其中可以使用顯式宣告使const具有內部連線:在匿名名字空可以使一些名字區域性於乙個編譯單位。匿名名字空間的效果很像內部連線(其實並不是,只是因為在別的編譯單位我們無法通過名字空間名訪問其中的名字)。

在c/c++程式裡,static也被用於表示「使用內部連線」,請不要在函式或類內部外使用static關鍵字。

9.2.1 標頭檔案

#include包含檔案時,就是使用檔案內容替換這個#include語句。

作為經驗,標頭檔案裡可以包括:

標頭檔案裡絕不該有:

常規的函式定義char get(char *p) ,資料定義int a;,聚集量的定義short tbl = ;匿名名字空間namespace ,匯出的模板定義export templatef(t t)。

9.2.2 標準庫標頭檔案

9.2.3 單一定義規則

1. 它們出現在不同的編譯單位。

2. 它們按乙個個單詞對應相同。

3. 這些單詞的意義在兩個編譯單位中也完全相同。

9.2.4 與非c+**的鏈結

9.2.5 連線與指向函式的指標

不同語言間,甚至相同語言不同編譯器編譯的obj檔案,相互連線是有困難的,比如在暫存器儲存引數的方式和引數入棧順序都會不相同。我們可以在extern宣告中給出相關的連線約定。例如extern "c" char* strcpy(char*,cosnt char*);說明它按照c連線約定進行連線。這部分不常用,僅僅有個概念,用到時在做研究。

9.3 使用標頭檔案

9.3.1 單一的標頭檔案

使用extern宣告標頭檔案中的資料(幾個原始檔的公用資料),在某個原始檔中定義它們,可以避免重複定義。

9.3.2 多個標頭檔案

程式規模稍大時推薦使用多個標頭檔案,每個複雜的原始檔可有兩個標頭檔案,乙個是呼叫介面的標頭檔案x.h,乙個是實現介面的標頭檔案x_impl.h這樣做的好處是邏輯明確,模組依賴度減少。

9.3.3 標頭檔案的使用

9.3.4 包含保護服

即使用條件編譯指令#ifndef避免標頭檔案重複包含。

9.4 程式

9.4.1 非區域性變數的初始化

原則上,所有在函式之外定義的變數應該在main呼叫前完成初始化。乙個編譯單位內這種非區域性變數按照它們定義的順序初始化。如果這樣的變數沒有顯式的初始式,它將被初始化有關型別的預設值。對於內部型別和列舉,預設值是0。(全域性變數為什麼一定要初始化呢,顯式的初始式和預設值也是有不同的,這好像跟exe檔案的結構有關係,下次再搞清楚這些問題)

9.4.1.1 程式終止

四種主要的終止方式:main返回,呼叫exit(),呼叫abort(),丟擲未捕捉的異常。其他病態的或未定義的方式也可使程式垮台。

程式呼叫exit()終止,所有構造起來的靜態物件的析構函式都被呼叫。而呼叫abort()則不做這些工作。這意味著exit()並不立即終止程式,在析構函式呼叫exit()可能導致無窮遞迴。但不提倡這樣終止程式,呼叫exit()的上游函式的區域性變數的析構函式都不會被呼叫!最好丟擲乙個異常,讓異常處理器決定做些什麼。

c/c++標準庫函式atexit()使我們可以讓程式終止前執行一些**,其中的規則和利弊留於用到時再討論。

標頭檔案和原始檔

一.例1 test.h void show test.cpp include using namespace std void show includeproblem.cpp include test.h int main 可以看到 includeproblem.cpp檔案彙總 include te...

C語言 大程式( c和 h)標頭檔案和原始檔

定義 產生 宣告 不產生 include include int max int a,int b 宣告 int main int max int a,int b 定義 這個是改良後的版本 main.c include 僅僅宣告了這個函式的型別 include 庫函式每次編譯都會使用,標頭檔案中的宣告...

opencms中用程式建立目錄和資源檔案

路徑的設定與當前操作檔案所在的目錄有關,假設當前檔案儲存在 system modules cn.dce.www.migrate elements 內 name resourcepath project static aboutus 123.html.name folderpath project s...