日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

再讨论下古老的include

發(fā)布時(shí)間:2025/3/15 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 再讨论下古老的include 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

再討論下古老的include,做c/c++局域網(wǎng)聊天編程的對(duì)我們都知道#include指令都不會(huì)陌生,絕大多數(shù)也都知道如何使用,但我相信仍有人對(duì)此是一知半解,

C:

我們都知道#include

C++:

我們都知道#include

表示包含C/C++標(biāo)準(zhǔn)輸入頭文件。包含指令不僅僅限于。h頭文件,可以包含任何編譯器能識(shí)別的C/C++代碼文件,包括。c,。hpp,。cpp,。hxx,。cxx等,甚至。txt,。abc等等都可以[局域網(wǎng)聊天]

2.名詞解釋

preprocess

預(yù)處理:為方便編譯器處理而設(shè)置的一種機(jī)制,包括一些常用預(yù)處理指令和語(yǔ)句,我們統(tǒng)稱為預(yù)處理系統(tǒng)。

如我們都知道#include #define #if……#else……#endif #pragma等

這些指令的實(shí)現(xiàn)是由編譯器來(lái)決定的(implementation specified)

提到預(yù)處理指令,順便說(shuō)一下頭文件防止重復(fù)包含的2種方法

a.保護(hù)宏

#ifndef _ABCDE_H

#define _ABCDE_H

/*

代碼部分

*/

#endif

在被包含過(guò)一次之后,宏_ABCDE_H已經(jīng)有了,下次再碰到就會(huì)略過(guò)從#define _ABCDE_H開(kāi)始到#endif之間的代碼

還有一種特定編譯器支持的指令:

b.#pragma once

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

但這2種方式是有區(qū)別的:

a.Macro guard可移植性好,絕大多數(shù)編譯器都支持,而且萬(wàn)一不小心拷貝了幾分相同的代碼也不會(huì)出問(wèn)題,但你得確保這個(gè)宏名不會(huì)與其他的宏沖突,否則等編譯器報(bào)出一大堆錯(cuò)誤的時(shí)候你可能會(huì)覺(jué)得莫名其妙;

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

declaration

聲明:指將一個(gè)名稱引入當(dāng)前編譯單元,或者重新聲明一個(gè)前面已經(jīng)聲明過(guò)的名稱,聲明指定了如何解釋一個(gè)名稱和該名稱具有的屬性;

例如:

int main(void)

{

int a; // 聲明了變量a,類型為int

int *pa; // 聲明了變量pa,類型為指向int型的指針類型

}

definition

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

a.聲明函數(shù)但不包括函數(shù)體;

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

c.聲明既沒(méi)有初始化語(yǔ)法,也沒(méi)有函數(shù)體;

d.類聲明中聲明靜態(tài)數(shù)據(jù)成員;

以上情況適用于C具有的特征,C++則完全適用,一般來(lái)說(shuō)定義要為其對(duì)象分配或預(yù)留存儲(chǔ)空間,而聲明則不用。

translation unit

編譯單元:一個(gè)源文件,。c .cpp等和它所包含的文件一起,在經(jīng)過(guò)預(yù)處理之后形成一個(gè)源碼文件,標(biāo)準(zhǔn)稱之為translation unit(編譯單元)包括一系列的聲明和定義;一個(gè)program(程序)由一個(gè)或多個(gè)編譯單元組成。編譯器將各個(gè)翻譯單元編譯為目標(biāo)代碼(。obj),通過(guò)連接器(linker)將這些編譯后的編譯單元(即目標(biāo)代碼)連接成完整的指令序列(可執(zhí)行文件、靜態(tài)庫(kù)、動(dòng)態(tài)庫(kù)等)。

one definition rule

一次定義規(guī)則:是指定義在所有進(jìn)入連接的編譯單元中只能有一次。

3.觀點(diǎn)、例子

A:頭文件只放聲明

example_a.h

void function();

example_a.cpp:

我們都知道#include "example_a.h"

void function()

{}

B.被包含的文件可以使用任意擴(kuò)展名:

只要是用符合標(biāo)準(zhǔn)的代碼編寫的文本文件,就可以使用我們都知道#include來(lái)進(jìn)行包含,包括。cpp .c等常見(jiàn)的源文件擴(kuò)展名; 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.標(biāo)準(zhǔn)頭文件的使用

最新的C++標(biāo)準(zhǔn)庫(kù)中的一切內(nèi)容都被放在名字空間std中(名字空間中的內(nèi)容對(duì)外是不可見(jiàn)的),但是帶來(lái)了一個(gè)新問(wèn)題,無(wú)數(shù)現(xiàn)有的C++代碼都依賴于使用了多年的偽標(biāo)準(zhǔn)庫(kù)中的功能,如聲明在等頭文件中的功能,使用std包裝標(biāo)準(zhǔn)庫(kù)導(dǎo)致現(xiàn)有代碼的不可用,為了兼容這種情況,標(biāo)準(zhǔn)委員會(huì)為包裝了std的那部分標(biāo)準(zhǔn)庫(kù)創(chuàng)建了新的頭文件,新的頭文件的文件名與舊的一樣,只是沒(méi)有。h這個(gè)后綴,如就變成了.對(duì)于C頭文件,采用同樣的方法,但還在每個(gè)頭文件名前加了字符c,如就變成了,變成了.最好使用新的文件頭,使用新的文件頭的C++程序,需要使用using namespace std或者using namespace std::指定的類名,等方法來(lái)使需要的類對(duì)于我們的代碼可視。

4.總結(jié)

既然是經(jīng)常使用的東西,我們就應(yīng)該明白它的原理,減少局域網(wǎng)聊天編程時(shí)的困惑,提高局域網(wǎng)聊天編程的效率。

總結(jié)

以上是生活随笔為你收集整理的再讨论下古老的include的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。