求真百科歡迎當事人提供第一手真實資料,洗刷冤屈,終結網路霸凌。

Include檢視原始碼討論檢視歷史

事實揭露 揭密真相
前往: 導覽搜尋
Include

來自 網絡 的圖片

Include是一個計算機專業術語,一指C/C++中包含頭文件命令,用於將指定頭文件嵌入源文件中。二指include 指令,在JSP中包含一個靜態的文件,同時解析這個文件中的JSP語句。三指PHP語句。

簡介

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

C:

  1. include <stdio.h>

C++:

  1. include <iostream>

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

預處理器發現 #include 指令後,就會尋找指令後面<>中的文件名,並把這個文件的內容包含到當前文件中。被包含文件中的文本將替換源代碼文件中的#include 指令, 就像你把被包含文件中的全部內容鍵入到源文件中的這個位置一樣。

評價

preprocess

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

如#include #define #if...#else...#endif #pragma等

這些指令的實現是由編譯器來決定的(implementation specified)

提到預處理指令,順便說一下頭文件防止重複包含的2種方法

a.保護宏(暫且稱為Macro guard 宏衛兵?):

  1. ifndef _ABCDE_H
  1. define _ABCDE_H

/*

代碼部分

  • /
  1. 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.類聲明中聲明靜態數據成員;

e.類名字聲明;

f.typedef聲明;

g.using聲明或者using指令;

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

translation unit

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

one definition rule

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

[1]

參考文獻

  1. Include搜狗