include[計算機專業術語]

include[計算機專業術語]
include[計算機專業術語]
更多義項 ▼ 收起列表 ▲

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

命令

引言

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

C:

#include <stdio.h>

C++:

#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 宏衛兵?):

#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

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

觀點、例子

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++代碼都依賴於使用了多年的偽標準庫中的功能,如聲明在<iostream.h>;等頭檔案中的功能,使用std包裝標準庫導致現有代碼的不可用,為了兼容這種情況,標準委員會為包裝了std的那部分標準庫創建了新的頭檔案,新的頭檔案的檔案名稱與舊的一樣,只是沒有.h這個後綴,如<iostream.h>;就變成了<iostream>;。對於C頭檔案,採用同樣的方法,但還在每個頭檔案名稱前加了字元c,如<string.h>;就變成了<cstring>;,<stdio.h>;變成了<cstdio>;。最好使用新的檔案頭,使用新的檔案頭的C++程式,需要使用using namespace std或者using namespace std::指定的類名,等方法來使需要的類對於我們的代碼可視。

用法

#include後面有兩種方式,<>;和""前者先在標準庫中查找,查找不到在path中查找。後者為檔案路徑,若直接是檔案名稱則在項目根目錄下查找

總結

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

JSP命令

指令

include[計算機專業術語] include[計算機專業術語]

Include 指令

在JSP中包含一個靜態的檔案,同時解析這個檔案中的JSP語句.

JSP 語法

<%@ include file="relativeURL" %>

例子

include.jsp:

<html>

<head><title>An Include Test</title></head>

<body bgcolor="white">

<font color="blue">

The current date and time are

<%@ include file="date.jsp" %>

</font>

</body>

</html>

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 %>;指命將會在JSP編譯時插入一個包含文本或代碼的檔案,當你使用<%@ include %>;指命時,這個包含的過程就當是靜態的。靜態的包含就是指這個被包含的檔案將會被插入到JSP檔案中去,這個包含的檔案可以是JSP檔案,HTML檔案,文本檔案。如果包含的是JSP檔案,這個包含的JSP的檔案中代碼將會被執行。

如果你僅僅只是用include 來包含一個靜態檔案。那么這個包含的檔案所執行的結果將會插入到JSP檔案中放<% @ include %>;的地方。一旦包含檔案被執行,那么主JSP檔案的過程將會被恢復,繼續執行下一行.

這個被包含檔案可以是html檔案,jsp檔案,文本檔案,或者只是一段Java代碼,但是你得注意在這個包含檔案中不能使用<html>,</html>,<body>,</body>;標記,因為這將會影響在原JSP檔案中同樣的標記 ,這樣做有時會導致錯誤.

有一些<%@ include %>;指命的行為是以特殊的JSP編譯條件為基礎,比如:

這個被包含的檔案必須對所有客戶都有開放且必須f有效,或者它有安全限制

如果這個包含檔案被改變,包含此檔案的JSP檔案將被重新編譯

屬性:

file="relativeURL"

這個包含檔案的路徑名一般來說是指相對路徑,不需要什麼連線埠,協定,和域名,如下:

"error.jsp""/templates/onlinestore.html""/beans/calendar.jsp"

如果這個路徑以"/"開頭,那么這個路徑主要是參照JSP套用的上下關係路徑,如果路徑是以檔案名稱或目錄名開頭,那么這個路徑就是正在使用的JSP檔案的當前路徑.

php語句

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.php<?php$color = 'green';$fruit = 'apple';?>test.php<?phpecho "A $color $fruit"; // Ainclude 'vars.php';echo "A $color $fruit"; // A green apple?> 如果 include 出現於調用檔案中的一個函數裡,則被調用的檔案中所包含的所有代碼將表現得如同它們是在該函式內部定義的一樣。所以它將遵循該函式的變數範圍。

例子 16-6. 函式中的包含

<?phpfunction foo(){ global $color; include 'vars.php'; echo "A $color $fruit";}/* vars.php is in the scope of foo() so * * $fruit is NOT available outside of this * * scope. $color is because we declared it * * as global. */foo(); // A green appleecho "A $color $fruit"; // A green?> 例子 16-7. 通過 HTTP 進行的include()

<?php/* This example assumes that is configured to parse .php * * files and not .txt files. Also, 'Works' here means that the variables * * $foo and $bar are available within the included file. */// Won't work; file.txt wasn't handled by as phpinclude '/file.txt?foo=1&bar=2';// Won't work; looks for a file named 'file.php?foo=1&bar=2' on the// local filesystem.include 'file.php?foo=1&bar=2';// Works.include '/file.php?foo=1&bar=2';$foo = 1;$bar = 2;include 'file.txt'; // Works.include 'file.php'; // Works.?>相關信息參見使用遠程檔案, fopen()file()

因為 include()require()是特殊的語言結構,在條件語句中使用必須將其放在語句組中(花括弧中)。

例子 16-8. include() 與條件語句組

<?php// This is WRONG and will not work as desired.if ($condition) include $file;else include $other;// This is CORRECT.if ($condition) { include $file;} else { include $other;}?>處理返回值:可以在被包括的檔案中使用 return()語句來終止該檔案中程式的執行並返回調用它的腳本。同樣也可以從被包含的檔案中返回值。可以像普通函式一樣獲得 include 調用的返回值。不過這在包含遠程檔案時卻不行,除非遠程檔案的輸出具有合法的 php 開始和結束標記(如同任何本地檔案一樣)。可以在標記內定義所需的變數,該變數在檔案被包含的位置之後就可用了。

因為 include()是一個特殊的語言結構,其參數不需要括弧。在比較其返回值時要注意。

例子 16-9. 比較 include 的返回值

<?php// won't work, evaluated as include(('vars.php') == 'OK'), i.e. include('')if (include('vars.php') == 'OK') { echo 'OK';}// worksif ((include 'vars.php') == 'OK') { echo 'OK';}?> 注:在 php 3 中,除非是在函式中調用否則被包含的檔案中不能出現 return。在此情況下 return()作用於該函式而不是整個檔案。

例子 16-10.include()return()語句

return.php<?php$var = 'php';return $var;?>noreturn.php<?php$var = 'php';?>testreturns.php<?php$foo = include 'return.php';echo $foo; // prints 'php'$bar = include 'noreturn.php';echo $bar; // prints 1?>$bar 的值為 1 是因為 include 成功運行了。注意以上例子中的區別。第一個在被包含的檔案中用了 return()而另一個沒有。如果檔案不能被包含,則返回 FALSE並發出一個 E_WARNING 警告。

如果在包含檔案中定義有函式,這些函式可以獨立於是否在 return()之前還是之後在主檔案中使用。如果檔案被包含兩次,php 5 發出致命錯誤因為函式已經被定義,但是 php 在 return()之後不會抱怨函式已定義。推薦使用 include_once()而不是檢查檔案是否已包含並在包含檔案中有條件返回。

另一個將 php 檔案“包含”到一個變數中的方法是用輸出控制函式結合 include()來捕獲其輸出,例如:

例子 16-11. 使用輸出緩衝來將 php 檔案包含入一個字元串

<?php$string = get_include_contents('somefile.php');function get_include_contents($filename) { if (is_file($filename)) { ob_start(); include $filename; $contents = ob_get_contents(); ob_end_clean(); return $contents; } return false;}?>要在腳本中自動包含檔案,參見 php.ini 中的 auto_prepend_file 和 auto_append_file 配置選項。

注:由於這是一個語言結構而非函式,因此它無法被變數函式調用。

相關詞條

相關搜尋

熱門詞條

聯絡我們