複製鏈接
請複製以下鏈接發送給好友

include

(計算機專業術語)

鎖定
include是一個計算機專業術語,一指C/C++中包含頭文件命令,用於將指定頭文件嵌入源文件中。二指include 指令,在JSP中包含一個靜態的文件,同時解析這個文件中的JSP語句。三指PHP語句。
外文名
include
環    境
在JSP中包含一個靜態的文件
應    用
計算機
路徑方式
;和""

include命令

include引言

做C/C++編程的對#include指令都不會陌生,絕大多數人也都知道如何使用,但我相信仍有人對此是一知半解:
C:
#include <stdio.h>
C++:
#include <iostream>
表示包含C/C++標準輸入輸出頭文件。包含指令不僅僅限於.h頭文件,可以包含任何編譯器能識別的C/C++代碼文件,包括.c、.hpp、.cpp、.hxx、.cxx等,甚至.txt、.abc等等都可以。
預處理器發現 #include 指令後,就會尋找指令後面<>中的文件名,並把這個文件的內容包含到當前文件中。被包含文件中的文本將替換源代碼文件中的#include 指令, 就像你把被包含文件中的全部內容鍵入到源文件中的這個位置一樣。 [1] 

include名詞解釋

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.類聲明中聲明靜態數據成員
e.類名字聲明;
f.typedef聲明;
g.using聲明或者using指令;
以上情況適用於C具有的特徵,C++則完全適用,一般來説定義要為其對象分配或預留存儲空間,而聲明則不用。
translation unit
編譯單元:一個源文件,.c .cpp等和它所包含的文件一起,在經過預處理之後形成一個源碼文件,標準稱之為translation unit(編譯單元)包括一系列的聲明和定義;一個program(程序)由一個或多個編譯單元組成。編譯器將各個編譯單元編譯為目標代碼(.obj),通過連接器(linker)將這些編譯後的編譯單元(即目標代碼)連接成完整的指令序列(可執行文件靜態庫動態庫等)。
one definition rule
一次定義規則:是指定義在所有進入連接的編譯單元中只能有一次。

include觀點、例子

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

include用法

#include後面有兩種方式,<>;和""前者在標準庫中查找,後者先在path中查找,若找不到,則到標準頭文件目錄中查找。

include總結

既然是經常使用的東西,我們就應該明白它的原理,減少編程時的困惑,提高編程的效率。

includeJSP命令

include指令

include include
Include 指令
JSP中包含一個靜態的文件,同時解析這個文件中的JSP語句.
JSP 語法
<%@ include file="relativeURL" %>
例子
include.jsp:
An Include Test
The current date and time are
<%@ include file="date.jsp" %>
date.jsp:
<%@ page import="java.util.*" %>
<%= (new java.util.Date()).toLocaleString() %>
Displays in the page:
The current date and time are
Aug 30,1999 2:38:40

include描述

<%@include %>;指命將會在JSP編譯時插入一個包含文本或代碼的文件,當你使用<%@ include %>;指命時,這個包含的過程就當是靜態的。靜態的包含就是指這個被包含的文件將會被插入到JSP文件中去,這個包含的文件可以是JSP文件,HTML文件,文本文件。如果包含的是JSP文件,這個包含的JSP的文件中代碼將會被執行。
如果你僅僅只是用include 來包含一個靜態文件。那麼這個包含的文件所執行的結果將會插入到JSP文件中放<% @ include %>;的地方。一旦包含文件被執行,那麼主JSP文件的過程將會被恢復,繼續執行下一行.
這個被包含文件可以是html文件,jsp文件,文本文件,或者只是一段Java代碼,但是你得注意在這個包含文件中不能使用,,,;標記,因為這將會影響在原JSP文件中同樣的標記 ,這樣做有時會導致錯誤.
有一些<%@ include %>;指命的行為是以特殊的JSP編譯條件為基礎,比如:
這個被包含的文件必須對所有客户都有開放且必須f有效,或者它有安全限制
如果這個包含文件被改變,包含此文件的JSP文件將被重新編譯
屬性:
file="relativeURL"
這個包含文件的路徑名一般來説是指相對路徑,不需要什麼端口,協議,和域名,如下:
"error.jsp""/templates/onlinestore.html""/beans/calendar.jsp"
如果這個路徑以"/"開頭,那麼這個路徑主要是參照JSP應用的上下關係路徑,如果路徑是以文件名或目錄名開頭,那麼這個路徑就是正在使用的JSP文件的當前路徑.

includephp語句

include()語句包含並運行指定文件。
以下文檔也適用於require()。這兩種結構除了在如何處理失敗之外完全一樣。include()產生一個警告而require()則導致一個致命錯誤。換句話説,如果想在遇到丟失文件時停止處理頁面就用require()。include()就不是這樣,腳本會繼續運行。同時也要確認設置了合適的 include_path。注意在 php 4.3.5 之前,包含文件中的語法錯誤不會導致程序停止,但從此版本之後會。
尋找包含文件的順序先是在當前工作目錄的相對的 include_path 下尋找,然後是當前運行腳本所在目錄相對的 include_path 下尋找。例如 include_path 是 .,當前工作目錄是 /www/,腳本中要 include 一個 include/a.php 並且在該文件中有一句 include "b.php",則尋找 b.php 的順序先是 /www/,然後是 /www/include/。如果文件名以 ../ 開始,則只在當前工作目錄相對的 include_path 下尋找。
當一個文件被包含時,其中所包含的代碼繼承了 include 所在行的變量範圍。從該處開始,調用文件在該行處可用的任何變量在被調用的文件中也都可用。不過所有在包含文件中定義的函數和類都具有全局作用域
例子 16-5. 基本的include()例子
vars.phptest.php 如果 include 出現於調用文件中的一個函數里,則被調用的文件中所包含的所有代碼將表現得如同它們是在該函數內部定義的一樣。所以它將遵循該函數的變量範圍。
例子 16-6. 函數中的包含
例子 16-7. 通過 HTTP 進行的include()
相關信息參見使用遠程文件,fopen()file()
因為include()require()是特殊的語言結構,在條件語句中使用必須將其放在語句組中(花括號中)。
例子 16-8. include() 與條件語句組
處理返回值:可以在被包括的文件中使用return()語句來終止該文件中程序的執行並返回調用它的腳本。同樣也可以從被包含的文件中返回值。可以像普通函數一樣獲得 include 調用的返回值。不過這在包含遠程文件時卻不行,除非遠程文件的輸出具有合法的 php 開始和結束標記(如同任何本地文件一樣)。可以在標記內定義所需的變量,該變量在文件被包含的位置之後就可用了。
因為include()是一個特殊的語言結構,其參數不需要括號。在比較其返回值時要注意。
例子 16-9. 比較 include 的返回值
注:在 php 3 中,除非是在函數中調用否則被包含的文件中不能出現 return。在此情況下return()作用於該函數而不是整個文件。
例子 16-10.include()return()語句
return.phpnoreturn.phptestreturns.php$bar 的值為 1 是因為 include 成功運行了。注意以上例子中的區別。第一個在被包含的文件中用了return()而另一個沒有。如果文件不能被包含,則返回FALSE併發出一個 E_WARNING 警告。
如果在包含文件中定義有函數,這些函數可以獨立於是否在return()之前還是之後在主文件中使用。如果文件被包含兩次,php 5 發出致命錯誤因為函數已經被定義,但是 php 在return()之後不會抱怨函數已定義。推薦使用include_once()而不是檢查文件是否已包含並在包含文件中有條件返回。
另一個將 php 文件“包含”到一個變量中的方法是用輸出控制函數結合include()來捕獲其輸出,例如:
例子 16-11. 使用輸出緩衝來將 php 文件包含入一個字符串
要在腳本中自動包含文件,參見 php.ini 中的 auto_prepend_file 和 auto_append_file 配置選項。
注:由於這是一個語言結構而非函數,因此它無法被變量函數調用。
參考資料