C 學習之旅二 說一說C 標頭檔案

2022-10-06 19:00:17 字數 2983 閱讀 3818

一、c++標頭檔案究竟是什麼,你怎麼看?

每個c++/c程式通常分為兩個檔案。乙個檔案用於儲存程式的宣告(declaration),稱為標頭檔案。另乙個檔案用於儲存程式的實現(implementation),稱為定義(definition)檔案。c++/c程式的標頭檔案以「.hwww.cppcns.com」為字尾,c程式的定義檔案以「.c」為字尾,c++程式的定義檔案通常以「.cpp」為字尾(像linux等系統以「.cc」或「.cxx」為字尾)。簡而言之,就是用於宣告的檔案。

那作為.net的程式設計師我們,我們會問這個問題,c#中的標頭檔案,你怎麼看?

c#中宣告和定義在乙個地方,相當於把頭檔案放在執行檔案中。 一般引用時,只需要用using引入命名空間即可。對於我們.net程式設計師可以這麼理解,標頭檔案是相當於命名空間的定義,引入以後,就相當於引入命名空間。我們.net中直接是引入命名空間的。

二、c++標頭檔案到底是哪些內容,你怎麼看?

標頭檔案由三部分內容組成:

(1)標頭檔案開頭處的版權和版本宣告

這部分有分結構具體如下:

①版權資訊。②檔名稱,識別符號,摘要。③當前版本號,作者/修改者,完成日期。④版本歷史資訊。

我們.net中有不有這類似的結構,你怎麼看啊?有啊,assemblyinfo.cs不就是詳細的記錄這些資訊嗎。

(2)預處理塊。

來瞧一瞧預處理塊。作為.net程式設計師的我們,你是不是對於預處理塊,聞所未聞。 他的意思非常的簡單,在編譯之前進行的處理。c++編譯器中有乙個預處理器,我們.net中並沒有乙個單獨的預處理的概念。他有分成了3個階段:

2.檔案包含;3.條件編譯。

什麼是巨集定義,

1.不帶引數的巨集定義:

巨集定義又稱為巨集代換、巨集替換,簡稱「巨集」。格式:#define 識別符號 字串其中的識別符號就是所謂的符號常量,也稱為「巨集名」。預處理(預編譯)工作也叫做巨集展開:將巨集名替換為字串。 掌握"巨集"概念的關鍵是「換」。一切以換為前提、做任何事情之前先要換,準確理解之前就要「換」。

對於不帶引數的巨集的說明如下:

(1)巨集名一般用大寫;(2)使用巨集可提高程式的通用性和易讀性,減少不一致性,減少輸入錯誤和便於修改。例如:陣列大小常用巨集定義;(3)預處理是在編譯之前的處理,而編譯工作的任務之一就是語法檢查,預處理不做語法檢查。;(4)巨集定義末尾不加分號;(5)巨集定義寫在函式的花括號外邊,作用域為其後的程式,通常在檔案的最開頭。 (6)可以用#undef命令終止巨集定義的作用域 (7)巨集定義可以巢狀(8)字串" "中永遠不包含巨集(9)巨集定義不分配記憶體,變數定義分配記憶體。

2.帶引數的巨集:

除了一般的字串替換,還要做引數代換格式:#define 巨集名(參數列) 字串

帶引數的巨集的說明:

(1)實參如果是表示式容易出問題

#define s(r) r*r

area=s(a+b);第一步換為area=r*r;,第二步被換為area=a+b*a+b;

正確的巨集定義是#define s(r) (r)*(r);

(2)巨集名和引數的括號間不能有空格 ;

(3)巨集替換只作替換,不做計算,不做表示式求解;

(4)函式呼叫在編譯後程式執行時進行,並且分配記憶體。巨集替換在編譯前進行,不分配記憶體;

(5)巨集的啞實結合不存在型別,也沒有型別轉換。

(6)函式只有乙個返回值,利用巨集則可以設法得到多個值;

(7)巨集展開使源程式變長,函式呼叫不會;

(8)巨集展開不佔執行時間,只佔編譯時間,函式呼叫佔執行時間(分配記憶體、保留現場、值傳遞、返回值)

說了這麼多c++的巨集定義,我們.net是不是支援巨集了,答案是肯定的。 可以使用以上的define的關鍵字可以實現c++的巨集定義的過程,一般是在類的頭部的宣告。

二檔案包含——乙個檔案包含另乙個檔案的內容

格式:

#include "檔名" 或#include 檔名》

編譯時以包含處理以後的檔案為編譯單位,被包含的檔案是原始檔的一部分。編譯以後只得到乙個目標檔案.obj,被包含的檔案又被稱為「標題檔案」或「頭部檔案」、「標頭檔案」,並且常用.h作副檔名。修改標頭檔案後所有包含該檔案的檔案都要重新編譯,標頭檔案的內容除了函式原型和巨集定義外,還可以有結構體定義,全域性變數定義:(1)乙個#include命令指定乙個標頭檔案;(2)檔案1包含檔案2,檔案2用到檔案3,則檔案3的包含命令#include應放在檔案1的頭部第一行;lllhpazcl(3)包含可以巢狀;(4)檔名》稱為標準方式,系統到頭檔案目錄查詢檔案,"檔名"則先在當前目錄查詢,而後到頭檔案目錄查詢;(5)被包含檔案中的靜態全域性變數不用在包含檔案中宣告。

說道這裡,我們.net是不是也有檔案包含的概念了,怎麼沒有了,你using 命名空間,不就是最好的.net檔案包含體現了。他編譯以後也是.obj檔案。

三 條件編譯—— 有些語句行希望在條件滿足時才編譯。

格式:(1)#ifdef 識別符號 程式段1#else程式段2#endif或#ifdef程式段1 #endif程式設計客棧當識別符號已經定義時,程式段1才參加編譯。格式:(2)#ifndef 識別符號 格式:(3) #if 表示式1 程式段1 #else程式段2#endif

當表示式1成立時,編譯程式段1,當不成立時,編譯程式段2。使用條件編譯可以使目標程式變小,執行時間變短。預編譯使問題或演算法的解決方案增多,有助於我們選擇合適的解決方案。此外,還有布局控制:#progma,這也是我們應程式設計客棧用預處理的乙個重要方面,主要功能是為編譯程式提供非常規的控制流資訊

.net中也有他的條件編譯的,無非也是一下的處理格式:

#if #elif #else #endif;

只不過,我們平時專案中很少用罷了,要學習的他的具體的部落格詳見:

(3)函式和類結構宣告等。

至於函式和類 結構的宣告,這裡真的不用進行過多的贅述。你理解為介面宣告,在原始檔中實現就ok了。

對頭檔案說了這麼多,也做與.net比較。我們一句話來總結,。net其實是有標頭檔案的,只不過分散在各個單獨的檔案中,而c++把這些內容集中在一起了。

本文標題: c++ 學習之旅二 說一說c++標頭檔案

本文位址: /ruanjian/c/89728.html

說一說C語言中的變數儲存型別 「extern」

請看下文 c語言中的變數有哪些儲存型別,你還記得嗎?extern如何使用你都掌握了嗎?看了本文你就清楚了。1 回顧c語言變數 c語言中變數值的儲存位置有兩類 cpu的暫存器和記憶體。變數儲存型別關係到其儲存位置,除了register型儲存在cpu暫存器中,c語言提供的其它三種儲存型別 auto型 s...

基礎知識 說一說c 中四種cast轉換

c 中四種型別轉換是 static cast,dynamic cast,const cast,reinterpret cast 1 const cast 用於將const變數轉為非const 2 static cast 用於各種隱式轉換,比如非const轉const,void 轉指標等,static...

說一說本人對linux系統學習的方法和經驗

linux系統是一套開源的並且能夠自由傳播的類似與unix作業系統,是乙個基於posix和unix的多工 多使用者 支援多執行緒和多cpu的作業系統。它能執行主要的unix工具軟體 應用程式和網路協議。linux繼承了unix以網路為核心的設計思想,是乙個效能穩定的多使用者網路作業系統。說了這麼多,...