再讨论下古老的include
再討論下古老的include,做c/c++局域網聊天編程的對我們都知道#include指令都不會陌生,絕大多數也都知道如何使用,但我相信仍有人對此是一知半解,
C:
我們都知道#include
C++:
我們都知道#include
表示包含C/C++標準輸入頭文件。包含指令不僅僅限于。h頭文件,可以包含任何編譯器能識別的C/C++代碼文件,包括。c,。hpp,。cpp,。hxx,。cxx等,甚至。txt,。abc等等都可以[局域網聊天]
2.名詞解釋
preprocess
預處理:為方便編譯器處理而設置的一種機制,包括一些常用預處理指令和語句,我們統稱為預處理系統。
如我們都知道#include #define #if……#else……#endif #pragma等
這些指令的實現是由編譯器來決定的(implementation specified)
提到預處理指令,順便說一下頭文件防止重復包含的2種方法
a.保護宏
#ifndef _ABCDE_H
#define _ABCDE_H
/*
代碼部分
*/
#endif
在被包含過一次之后,宏_ABCDE_H已經有了,下次再碰到就會略過從#define _ABCDE_H開始到#endif之間的代碼
還有一種特定編譯器支持的指令:
b.#pragma once
能保證該文件(物理上的)只被編譯一次,也能起到防止重復包含的作用
但這2種方式是有區別的:
a.Macro guard可移植性好,絕大多數編譯器都支持,而且萬一不小心拷貝了幾分相同的代碼也不會出問題,但你得確保這個宏名不會與其他的宏沖突,否則等編譯器報出一大堆錯誤的時候你可能會覺得莫名其妙;
b.#pragma once指令簡單,它能保證該文件(物理上的)只被編譯一次,不用去費勁的想不同的宏名,但如果有幾份該文件的拷貝,顯然起不到作用。
declaration
聲明:指將一個名稱引入當前編譯單元,或者重新聲明一個前面已經聲明過的名稱,聲明指定了如何解釋一個名稱和該名稱具有的屬性;
例如:
int main(void)
{
int a; // 聲明了變量a,類型為int
int *pa; // 聲明了變量pa,類型為指向int型的指針類型
}
definition
定義:除了以下情況,聲明就是定義
a.聲明函數但不包括函數體;
b.聲明包含extern鏈接限定符,例如:extern int a;
c.聲明既沒有初始化語法,也沒有函數體;
d.類聲明中聲明靜態數據成員;
以上情況適用于C具有的特征,C++則完全適用,一般來說定義要為其對象分配或預留存儲空間,而聲明則不用。
translation unit
編譯單元:一個源文件,。c .cpp等和它所包含的文件一起,在經過預處理之后形成一個源碼文件,標準稱之為translation unit(編譯單元)包括一系列的聲明和定義;一個program(程序)由一個或多個編譯單元組成。編譯器將各個翻譯單元編譯為目標代碼(。obj),通過連接器(linker)將這些編譯后的編譯單元(即目標代碼)連接成完整的指令序列(可執行文件、靜態庫、動態庫等)。
one definition rule
一次定義規則:是指定義在所有進入連接的編譯單元中只能有一次。
3.觀點、例子
A:頭文件只放聲明
example_a.h
void function();
example_a.cpp:
我們都知道#include "example_a.h"
void function()
{}
B.被包含的文件可以使用任意擴展名:
只要是用符合標準的代碼編寫的文本文件,就可以使用我們都知道#include來進行包含,包括。cpp .c等常見的源文件擴展名; example_b_1.b
void function();
example_b_1.cpp:
我們都知道#include "example_b_1.b"
void function()
{}
example_b_2.b
void function1();
void function2();
example_b_21.cpp:
void function1()
{}
example_b_22.cpp:
我們都知道#include "example_b_1.b"
我們都知道#include "example_b_21.cpp"
void function2()
{}
上面的例子中,example_b_21.cpp僅被包含在xample_b_22.cpp中,不再被其他的文件包含,而且不加入工程中;
C.標準頭文件的使用
最新的C++標準庫中的一切內容都被放在名字空間std中(名字空間中的內容對外是不可見的),但是帶來了一個新問題,無數現有的C++代碼都依賴于使用了多年的偽標準庫中的功能,如聲明在等頭文件中的功能,使用std包裝標準庫導致現有代碼的不可用,為了兼容這種情況,標準委員會為包裝了std的那部分標準庫創建了新的頭文件,新的頭文件的文件名與舊的一樣,只是沒有。h這個后綴,如就變成了.對于C頭文件,采用同樣的方法,但還在每個頭文件名前加了字符c,如就變成了,變成了.最好使用新的文件頭,使用新的文件頭的C++程序,需要使用using namespace std或者using namespace std::指定的類名,等方法來使需要的類對于我們的代碼可視。
4.總結
既然是經常使用的東西,我們就應該明白它的原理,減少局域網聊天編程時的困惑,提高局域網聊天編程的效率。
總結
以上是生活随笔為你收集整理的再讨论下古老的include的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SqlServer2005/2008下s
- 下一篇: 未能加载文件或程序集“Iesi.Coll