首先Window中有很多亂七八糟的路徑變數之類的,歸類下來有幾類,主要是為了我們分清楚概念,以免搞的糊塗了。

1. Window系統的環境變數:顧名思義,就是系統級別的變數,或者利用我們程式設計的角度來講,作用域就相當於全域性變量了。

2. Window使用者的環境變數:既然有全域性的,那肯定就有區域性的了,所以這個變數可以當作是區域性變數,當然編寫程式的時候區域性變數的作用域內是可以覆蓋掉同 名的全域性變數的,這個原理同樣是適用這裡的環境變數。當然我說的只是在作用域內,預設是用的區域性變數(window使用者變數),當然作用域外就成了全域性變 量的天下,而且全域性變數即使是在區域性變數的作用域內,也可以用的,在程式設計中,可以用作用域符號區分,所以這要看程式要用什麼變量了。

3. 應用程式自己設定的環境變數:這又更進一步,當然自己設定的,一般先用自己的了。

好 像越說越糊塗啊,呵呵,也許有些人還沒有理解什麼環境變數呢,就說了一堆廢話。給你個最恰當的例子,在windowXP的“我的電腦”上右擊滑鼠,選擇屬 性。轉到高階選項卡,點選環境變數四個字,然後你就找到什麼是系統變數什麼又是使用者變量了。使用者變數就是針對每個使用者而言的,如果你的登陸名是 administrator,那麼這個裡面的變數就是針對你的,你發現你的這倆個變數裡面都有很多內容,這些變數實際的作用都是提供給系統和系統以外的程 序使用的。

你在開始->執行裡面敲入“cmd”,這個就是window底下虛擬dos,你敲入path,發現顯示出來 什麼了?一堆路徑,恩對了,就是一堆路徑,這對路徑就是cmd使用的路徑,用它來幹什麼呢?當然是用來找東西了,找檔案。比如你寫入一個notepad, 你會發現記事本彈出來了。為什麼它能找到記事本呢?記事本一般在系統盤的windows/system32底下有,你應該注意到path路徑裡面有一個諸 如:”c:\windows\system32”,這樣的路徑,對了,環境變數就是提供給程式來使用的,“cmd”程式就是用這個path環境變數來搜尋 notepad這個檔案的,當你寫入notepad,Enter之後,他就開始按照順序查找了,先是當前目錄尋找,然後是從path變數中提取出第一個分 號前面的內容,然後查詢,如果找到結束,如果沒有找到繼續找。這個只是系統中的一個變數path變數,並不是說系統的變數是path,要分清楚概念。他們 是包含關係,誰包含誰,你應該明白,如果不明白,說明我上面一堆廢話等於白說了。最後,你還會發現cmd path的路徑會有系統和使用者的變數。這也就是說它倆個都用了。(不稀奇,應用程式想用什麼就用什麼)。

Ok,上面說的那麼一堆,都是告訴你環境變數的作用是什麼。很明顯,是為程式和系統服務的,當他們需要的時候。^_^.

好 現在從簡單的說,我們知道java要設定變數,一個是path(我們剛剛提到的的),一個是classpath。Path我們知道,想要隨便開啟歌cmd 視窗,在任意的路徑下都能執行到諸如“java,javac”,這樣的命令,就要提供path路徑給cmd程式。(注意,是提供給cmd程式,不是別的什 麼),所以我們會設定java的bin資料夾的路徑到path裡面,bin資料夾裡面都是java的執行程式(編譯器,偵錯程式,反編譯等等),其中就包括 java和javac這種程式,當我們開啟cmd準備編譯程式時候,會寫如javac,恩,這個只是程式的名字,後面接個引數,比如檔名,然後cmd就 會根據path路徑找到相應的javac程式,然後執行之。那classpath是幹什麼用的呢?它是提供給java(預設在java jdk的bin目錄裡面)這個程式用的。因為我們編譯好後,會發現有時候生成的檔案不止一個,而且有時候生成的檔名也很奇怪,和我們主程式的檔名不一 樣。恩java就是這樣的,他生成的class中間檔案,檔案數量是根據源程式中的類的數目決定的,而且檔名和類名是一樣的,也就是一個類對應一個檔案 了,問題不在這裡,而且使用過java的人都知道這個問題。問題在於當我們是用了很多包來管理的,java是如何找這些類名的,如果所有的類都在當前目錄 底下,這個好說,因為我只要在當前目錄底下寫入java 類名,就可以執行了。問題是,當我們引入包的時候,你會發現有很多資料夾子,這個就難辦了,你會發現有很多奇怪的錯誤,它會提示找到什麼什麼之類的錯誤, 原因就是引用包的時候(import),有個查詢路徑,比如說import java.lang.*;java和lang都是指的實際的資料夾,這個資料夾在哪裡?這裡就用到classpth,從classpath給出的路徑中開 始找,先找java資料夾,如果找到,再找lang資料夾,然後就是引用所有的類檔案,這樣你要的類就找到了,因為一個類都對應了同名的資料夾。 classpath就是這個作用,與其說是提供給java的,倒不如說提供給包的管理機制的,這就看你怎麼理解了。它平常是有倆個元素,一個是”.”,即 所謂的當前路徑,另外一個是”jre”的路徑,這路徑底下有java程式設計的時候用到的一堆庫,通常主要的庫打包成一個jar檔案,所以你看不到java之 類的資料夾,不過你用winRAR開啟之後,你會發現裡面有這樣的資料夾。看來環境變數說到底,就是為了程式而服務的。就是這麼簡單。說簡單也不簡單,呵 呵,理解了就簡單了,理解不了就是不簡單,簡單于不簡單之間,只是一點之差。

VC的也有所謂的環境變數,它也用到了系統提供 的環境變數。說起來也很麻煩的,所以就放到了後面說了。先說說VC的‘比較’底層的工作原理。VC++ 6 (sp2)之類的軟體,都是IDE環境也就是 integrated development environment(不知道拼寫的對不對,不過就是這個意思:整合開發環境)。也就是說它只是個GUI環境,為了方便使用者程式設計使用的,而說道它是怎麼 來編譯程式的,它用的是另外一套比較底層的,基於命令環境的程式。在vc的安裝目錄裡面,一般是先進入vc的目錄,會看到一個bin的資料夾,裡面就有很 多可執行程式,其中有cl.exe 和 link.exe 這倆個程式是VC編譯和連線程式的時候程序呼叫到的倆個程式。說到底,就是當我們寫好程式之後,我們先用cl.exe 來編譯原始碼為中間檔案(.obj),然後link.exe 來連結程式。而平常我們會配置VC工程的一些引數,比如在project選單裡面,有個Setting,我們會配置的一般是link選項卡,這些配置,實 際上就是在cl.exe 或者 link.exe 後面加上一些引數而已。例如 /D "strings"這種引號裡面字串,一般都是提供給程式cl.exe 程式的“巨集變數”,也就是相當於在編譯前,在原始碼裡面添加了這些變數先。當你編譯完之後,你可以在你的程式碼工程裡面找到一個vc生成的.html網頁文 件,雙擊開啟,你就會看到vc是如何呼叫外部底層編譯器,編譯及其連線檔案的。

好了言歸正傳,對VC環境配置的情況,一般是 我們要用其它庫的時候,才會做,或者當我們編寫Dll,lib的時候才會涉及到的。一般情況下我們不需要做什麼,畢竟微軟做的“傻瓜”化系統,的確夠傻 的。呵呵。Vc裡面有個配置路徑的地方,就是:Tools --> Options... --> Directories 。這個地方就是VC配置環境路徑的地方,有幾個路徑,一個是include路徑,一個library路徑,和 source路徑,常用的就是前倆個,因為至今為止,我都沒有用過source路徑。(source路徑據我推測是當我們跟蹤除錯的時候用 的)Include路徑,顧名思義,就是include包含檔案的路徑,library路徑呢?當然就是找那些真正函式原始碼的地方。當然上面說的不是很 明白,下面就找個例子來說。

首先,你要新建個工程了,console模式或者win32模式都無所謂的,好寫個最簡單的console模式的helloworld吧。

#include <stdio.h>

int main(int argc, char *argv[])

{

printf("Hello World!\n");

return 0;

}

這 個程式我們學過C語言的都知道是什麼,我們要說的是看那個 stdio.h那個檔案,它使用"<>"來引起來的,上過課程的人都應該知道"<>" ,和雙引號的區別,前面的是直接在系統提供的目的底下尋找stdio.h,而後者還會從當前源程式所在的當前路徑進行查詢。這是老師們說的,我們也記住 了,但至於到底stdio.h在哪裡,系統目錄到底是什麼?我們不知道有幾個會想過,當然那些喜歡鑽研的人肯定是想過了,但我想70%的人還是沒有想過 的。呵呵。好先解決第一個問題,所謂的上面說的系統目錄是哪裡?是我們上面說的系統變數提供的path目錄麼?這個問題我之前也不清楚,但是經過我的試 驗,發現這裡的所謂的include的系統目錄,只是VC配置路徑include我提供的目錄,也就是上面我提到的Tools --> Options... --> Directories ,裡面的include的路徑。簡而言之,就是當我們用了一個<>來include一個檔案的時候,VC編譯器就是利用它自己的配置的路徑最 為預設的查詢路徑,進行“一級查詢”,注意這裡已經上面提到的,它的查詢只是一級的,什麼意思呢?就是不會查詢子資料夾,只會查詢一層。那我們就該斷定 vc裡面設定的include路徑,其中一個肯定有stdio.h這個檔案,到底有沒有呢?你要自己去找了。我的路徑“D:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\”,這個底下,你會發現一個stdio.h的檔案,到底是不是它呢?我們就可以來做試驗了,方法很簡單,刪了 它?No!你刪了它你再怎麼找回來?當然是是rename就可以了嘛,呵呵,我的做法就是rename stdio.h as stdios.h,這樣你再次回到剛才的程式,先build -> clean,然後在編譯,發現了嗎?系統提示說找不到stdio.h這個檔案了。上面的過程只是我用試驗的方法得出的,至於它有沒有找window提供的 系統變數的path路徑,你可以做個試驗嘛?怎麼做?自己想!然後先不要改回來,把那個檔案複製到自己程式的目錄裡面,更改 #include <stdio.h> 為 #include "stdio.h", 然後將複製過了的檔案也改為stdio.h檔案,再次編譯看看,呵呵,是不是可以用啦?恩,說明老師們說的的確是對的,雙引號會找當前目錄的檔案,但我們 應該進一步的想一下,他是否會找window系統提供的環境變數的path路徑呢?通過試驗,我給你一個結論,不管是尖括號還是雙引號,都不會去找的。放 心了吧現在,沒有什麼疑惑了吧。呵呵。這個你只是菜鳥初飛了,至於大蝦,還遠哪。那個library路徑是幹什麼用的才是精華所在。

我 們都應該知道吧,include檔案裡面是寫什麼東西,不然不知道,你就開啟它看看,研究研究它的原始碼也是大有好處的,恩。一般.h的檔案,都是標頭檔案, 程式設計規範中也是提到,任何涉及到實現的程式碼都不要放入其中,它只是用來放巨集引數的宣告,函式的宣告,變數的宣告(注意我用的是“宣告”,而不是"定義", 一定要區分這倆個意思,定義就是實現了,我們不要在。H檔案裡面進行實現任何東西!)。還是拿上面的那個程式來說,printf這個函式在stdio.h 檔案裡面包含了宣告(其實stdio.h裡面包含了很多標頭檔案,printf只是其中一個頭檔案的裡面的,至於在哪裡,自己找)。這樣,當我們呼叫 printf這個函式的時候,我們就要進入printf這個函式體裡面去執行程式碼,那這個printf在哪裡呢?Stdio.h只是包含了它的宣告,也就 是隻是一個函式型別加函式名加函式引數,函式體是沒有的,它難道沒有程式碼就可以執行了?當然不是了。它有函式體,他在哪裡?