以前在學校的時候, 老師教我們在編寫C語言的時候不要忘記包含標頭檔,這裡指的是副檔名是.h的檔案,以前一直不明白這個機制,總以為這個是不能自訂的,只能包含庫標頭檔。但是今天有點頭腦發熱,想自己試試自己的猜想是不是正確的,於是早上起來自己寫了幾句小代碼想驗證一下自己的想法是否是對的。
來看看我的實驗代碼:
第一個是主程式的源檔案名稱:main.c,存放在任意的系統中的任意一個目錄中, 由於是在WinXP上實驗,同時採用的編譯環境是WinTC, 所以要保證編譯路徑的每一級目錄名(檔案夾名)的長度不長於8個字元, 同時要保證路徑中不能包含Unicode字元編碼(這個我不肯定,因為對日文、韓文等沒有測試,僅在中文環境測試時這樣的),即目錄名不能有漢字。
Exp1:
/***************************
include 包含指令的學習測試代碼
***************************/
#include <stdio.h>
#inlcude "C:\define.h"
int main(int argc, char *argv[] )
{
printf("%ld",UINTMAX);
printf("\nThe size of int in this system is:%d",INTLEN);
getch();
return 0 ; //通常這個地方對環境指令碼影響應該會比較大,但是對自己本身的程式,好像影響不大,估計是編譯器對這個要求不嚴,要不就是編譯器會自動 //加上這個語句吧,
}
然後下面是我的define.h 檔案, 存放在C盤根目錄下:
#define SIZE sizeof(int)
#if 4==SIZE
#define UINTMAX 4294967295
#define INTLEN 4
#else
#define UINTMAX 65535
#define INTLEN 2
#endif
程式經過編譯和運行得到的結果如下所示:(本來要貼圖的,但是我不會貼圖)
65535
The size of the int in this systemis: 2
運行居然能成功,與我猜想的一樣, include 指令可以包含程式員自己定義的標頭檔,而不單單是只能包含編譯環境所帶的標頭檔。
由此我猜想: 如果我把我用的define.h 檔案成.c 檔案是否可以成功,結果也成功,並且運行結果與前面的一樣; 進而我就進一步猜想,我把檔案名稱改成.txt來實驗一下,結果同樣成功。
通過上面的實驗我得出一個結論: include 指令包含的檔案與檔案的副檔名沒有多大關係,只要檔案內容按照C語言的規範進行描述,同時儲存檔案的內容編碼是按照文字檔編碼就可以。
下面來討論一下預先處理的機制:
1、 include 指令
首先說明一句 include 不是C語句。 但是include 在C來源程式代碼中使用了,那為什麼又不是C語句呢? 其實很簡單, 在C規範裡面,C語句明確的定義為以分號 ';' 結束的是C語句。
通過我上面的實驗加上一些文檔的介紹我個人認為: include 給程式員提供了一種搜尋檔案的功能,這個搜尋過程是在程式員制定的路徑下進行,當程式員指定的檔案存在就把檔案的內容,一致的複製一個副本到來源程式的代碼中,並進行編譯。
2、 include <> 和 include " "的區別
<>表示搜尋路徑是在編譯環境設定的環境變數裡面搜尋
" "則表示在環境變數設定的路徑裡面搜尋,如果搜尋不到則到使用者制定的目錄下搜尋
3、針對上面的代碼再說一下
#if
#else
#endif
這 個預先處理指令的使用與if...else...語句的使用是一樣的,只是格式有點不一樣, 同時這個語句也可以在main函數中使用, 我上學的時候不知道(我學的是自動化,非電腦專業,老師沒有教,用的是自己老師編寫的教材, 推薦的參考書是譚浩強的第二版的那本書,裡面都沒有樣本這樣用的)
而且我們發現:
#if
#else
#endif 的判斷條件不需要用() 括起來, 我實驗過,如果括起來也是可以的,這是與if...else...語句最大的不同,其他的都一樣。