基本標示符 巨集 編譯連線

2021-07-24 07:35:17 字數 2980 閱讀 8819

勵志做乙個文藝程式設計師的我,發現自己還是缺少文藝細胞,所以部落格名字非常直白,就是來說一說基本標示符合巨集以及編譯連線的過程。

首先是基本標示符,這就簡單來談四個:__file__,__line__,__date__,__time__.

第乙個:__file__:顧名思義就是檔案的儲存位置,這個在列印語句中是用%s來輸出的;

第二個:__line__:這個就是此時你的列印語句在這個c程式的第幾行,用%d顯示;

第三個:__date__:這個是顯示當前的日期,包括年份、月份和日期,因為是英文的緣故,是按年,日,月來輸出的;

第四個:__time__:這個用來顯示當前的時間。

以下是**實現

#define _crt_secure_no_warnings

#includeint main()

這個就十分簡單了,就不多說了。

#define m 10  //這個就是這個c檔案中想用10時,採用m就行,加深了**的靈活性
除了這個,巨集還有很多的作用,並且巨集是在預處理階段進行的,即編譯階段就會將巨集的作用體現,這個在vs裡面沒法看,在linux裡面會發現gcc編譯之後就會發現.i檔案中已經實現了巨集。

要注意的是,在巨集裡定義時,要養成乙個加小括號的習慣,例如

#define add(a,b)  a * b
假如是3*5的話,會正確是輸出15,但是如果a為1+2,b是4+1時,這個時候的邏輯就是1+2 * 4+1 ,這個時候的優先順序是先乘法再加法,結果就是10,而不是需要的15,但如果加括號的話就是(1+2)*(4+1),出來的就是15了,同理,為了防止其他的問題,也應該給整個式子加上括號((1+2)*(4+1))。

巨集在定義函式時,要進行dowhile(0)的操作,為的是防止函式後面的分號,和main函式裡面的分號產生衝突。例如:

#define name dowhile(0)

int main ()

這時就不用在意分號了(只要你輸入無誤)。

同樣,巨集裡面還能定義字串。例如「

#define str 「hello」

int mian ()

此時,因為巨集定義的鄰近字串的連線特性,可以直接採用str,而不用給str帶上雙引號。

巨集定義裡面還可以將兩個連線成乙個,說起來可能不是很好表達,大家看一下**

#define m  "hello "
#define n  "world "
#define mn "hello world "
#define link(x,y)  x##y
int main()
巨集的定義還有很重要的一點,那就是條件編譯,這個在我們寫**,專案的時候對我們非常有幫助,一方面可以防止標頭檔案被重複呼叫,另一方面可以讓我們將巨集用的更加靈活,對巨集的定義也更深刻,下面的也只是我的一點理解,有不足的地方還請告知。

例如:#define後乙個名稱,用到一半,在下面的檔案中發現還有別的函式或者變數更適合這個名字,此時你可以用#undef來移除這個巨集定義,那麼之前你定義的那個巨集定義就會失去作用,但在#undef之前還可以使用。但是這個不建議使用,假如你這樣使用,或許別人有時會忽略或者沒看到中間的#undef,那麼會一直以為你的巨集定義是之前的意思,容易造成誤解,  不過要是只有你自己看的話那就隨便咯。

還可以用來檢測是否被定義

#if  !define(symbel)   //檢測symbel是否被定義,沒有定義的話執行下面的語句
#define  symbel    //沒有定義,測定義symbel
另乙個作用:

//1
#define name ...  //定義name

#if  name  語句1   //若name為真,則輸出語句1
#endif
//2
#define name ...  //定義name
#if  name  語句1   //若name為真,則輸出語句1
#elif name1  語句2   //若name1為真,則輸出語句1
#elif name2   語句3    //若name2為真,則輸出語句1
...
#endif

編譯連線:

說實話。我對這個也不是很了解,而僅有的這些還是在linux上了解的,首先建立好乙個簡單的c檔案之後,編譯這個檔案,這時會進行預處理,而預處理會進行四項活動分別是:標頭檔案展開、去注釋、巨集替換、條件編譯。這些在linux上你將.c檔案轉為.i檔案後可以看見採用gcc -e test.c -o test.i語句,再使用cat test.i可以進入.i檔案進行檢視,假如你還覺得不是很貼近計算機的方式還可以用gcc -s test.i -o tets.s,再用cat test.s進行檢視組合語言,要是你還覺得不過癮,那就gcc -c test.s -o test.o,再用cat檢視8進製或者16進製制的01序列吧。

而且,本地中有很多標頭檔案還有庫函式,在編譯期間並沒有將這些東西編譯進去,那麼會在什麼時候起作用呢?會在鏈結時,將你自己的c檔案編譯完成沒有錯誤之後,和這寫庫函式進行統一的鏈結,形成乙個完整的可執行檔案,把可執行程式需要的所有編譯過程產生的.o或者obj檔案組合到一起(包括.lib),另外連線過程還會組合一些其他資料,比如次元,可執行檔案頭等。

巨集定義中的 連線符與 符

連線符與 符 連線符號由兩個井號組成,其功能是在帶引數的巨集定義中將兩個子串 token 聯接起來,從而形成乙個新的子串。但它不可以是第乙個或者最後乙個子串。所謂的子串 token 就是指編譯器能夠識別的最小語法單元。具體的定義在編譯原理裡有詳盡的解釋,但不知道也無所謂。同時值得注意的是 符是把傳遞...

巨集定義中的 連線符與 符

連線符與 符 連線符號由兩個井號組成,其功能是在帶引數的巨集定義中將兩個子串 token 聯接起來,從而形成乙個新的子串。但它不可以是第乙個或者最後乙個子串。所謂的子串 token 就是指編譯器能夠識別的最小語法單元。具體的定義在編譯原理裡有詳盡的解釋,但不知道也無所謂。同時值得注意的是 符是把傳遞...

巨集定義中的 連線符與 符

連線符與 符 連線符號由兩個井號組成,其功能是在帶引數的巨集定義中將兩個子串 token 聯接起來,從而形成乙個新的子串。但它不可以是第乙個或者最後乙個子串。所謂的子串 token 就是指編譯器能夠識別的最小語法單元。具體的定義在編譯原理裡有詳盡的解釋,但不知道也無所謂。同時值得注意的是 符是把傳遞...