程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++ include機制基本概念詳解

C++ include機制基本概念詳解

編輯:C++入門知識

在C++編程語言這樣的一個功能強大的語言中,有很多高深的內容值得我們去深入的研究。比如今天為大家介紹的C++ include機制就是其中一個比較難以理解的內容。下面就讓我們一起來對此進行解讀。

做c/c++編程的對#include指令都不會陌生,絕大多數也都知道如何使用,但我相信仍有人對此是一知半解

  1. C:  
  2. #include < stdio.h> 
  3. C++:  
  4. #include < iostream> 

表示包含C/C++標准輸入頭文件。包含指令不僅僅限於.h頭文件,可以包含任何編譯器能識別的C/C++代碼文件,包括.c,.hpp,.cpp,.hxx,.cxx等,甚至.txt,.abc等等都可以

  • C++ Cstring應用方法概述
  • C++ typeof基本應用方式解析
  • C++訪問控制符內容相關介紹
  • C++成員函數指針詳細使用指南
  • C++ explicit關鍵字基本內容概述

1.C++ include機制名詞解釋

預處理preprocess)

為方便編譯器處理而設置的一種機制,包括一些常用預處理指令和語句,我們統稱為預處理系統。

如#include #define #if...#else...#endif #pragma等。這些指令的實現是由編譯器來決定的(implementation specified)提到預處理指令,順便說一下頭文件防止重復包含的2種方法

a.保護宏

  1. #ifndef _ABCDE_H  
  2. #define _ABCDE_H  
  3. /*  
  4. 代碼部分  
  5. */  
  6. #endif 

在被包含過一次之後,宏_ABCDE_H已經有了,下次再碰到就會略過從#define _ABCDE_H開始到#endif之間的代碼
還有一種特定編譯器支持的指令:

  1. b.#pragma once 

能保證該文件物理上的)只被編譯一次,也能起到防止重復包含的作用

但這2種方式是有區別的:

a.Macro guard可移植性好,絕大多數編譯器都支持,而且萬一不小心拷貝了幾分相同的代碼也不會出問題,但你得確保這個宏名不會與其他的宏沖突,否則等編譯器報出一大堆錯誤的時候你可能會覺得莫名其妙;

b.#pragma once指令簡單,它能保證該文件物理上的)只被編譯一次,不用去費勁的想不同的宏名,但如果有幾份該文件的拷貝,顯然起不到作用。

聲明declaration)

指將一個名稱引入當前編譯單元,或者重新聲明一個前面已經聲明過的名稱,聲明指定了如何解釋一個名稱和該名稱具有的屬性;
例如:

  1. int main(void)  
  2. {  
  3. int a; // 聲明了變量a,類型為int  
  4. int *pa; // 聲明了變量pa,類型為指向int型的指針類型  

定義definition)

除了以下情況,聲明就是定義

a.聲明函數但不包括函數體;

b.聲明包含extern鏈接限定符,例如:extern int a;

c.聲明既沒有初始化語法,也沒有函數體;

d.類聲明中聲明靜態數據成員;

e.類名字聲明;

f.typedef聲明;

g.using聲明或者using指令;

以上情況適用於C具有的特征,C++則完全適用,一般來說定義要為其對象分配或預留存儲空間,而聲明則不用。

編譯單元translation unit)

一個源文件,.c .cpp等和它所包含的文件一起,在經過預處理之後形成一個源碼文件,標准稱之為translation unit(編譯單元)包括一系列的聲明和定義;一個program(程序)由一個或多個編譯單元組成。編譯器將各個翻譯單元編譯為目標代碼(.obj), 通過連接器(linker)將這些編譯後的編譯單元即目標代碼)連接成完整的指令序列可執行文件、靜態庫、動態庫等)。

一次定義規則one definition rule)

是指定義在所有進入連接的編譯單元中只能有一次。

2.C++ include機制觀點、例子

A:頭文件只放聲明

  1. example_a.h  
  2. void function();  
  3. example_a.cpp:  
  4. #include "example_a.h"  
  5. void function()  
  6. {} 

B.標准頭文件的使用

最新的C++標准庫中的一切內容都被放在名字空間std中名字空間中的內容對外是不可見的),但是帶來了一個新問 題,無數現有的C++代碼都依賴於使用了多年的偽標准庫中的功能,如聲明在< iostream.h>等頭文件中的功能,使用std包裝標准庫 導致現有代碼的不可用,為了兼容這種情況,標准委員會為包裝了std的那部分標准庫創建了新的頭文件,新的頭文件的文件名與舊的一樣,只是沒有.h這個後 綴,如< iostream.h>就變成了< iostream>。對於C頭文件,采用同樣的方法,但還在每個頭文件名前加了字符 c,如< string.h>就變成了< cstring>,< stdio.h>變成了< cstdio>。 最好使用新的文件頭,使用新的文件頭的C++程序,需要使用using namespace std或者using namespace std::指定的類名,等方法來使需要的類對於我們的代碼可視。

3.總結

既然是經常使用的東西,我們就應該明白它的原理,減少編程時的困惑,提高編程的效率。以上就是對C++ include機制的相關介紹。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved