條件編譯的作用以及原因

2021-06-07 04:24:02 字數 1173 閱讀 4803

我們在寫程式的過程中老是在標頭檔案用這樣的語句:

#ifdef 標誌符

程式段1

#else

程式段2

#endif

我們知道這是為了進行條件編譯。即當定義了標誌符則對程式段1進行編譯,而沒有定義標誌符時則編譯程式段2。那麼為什麼要這要呢?

其實這跟事物具有多樣性一樣。我們需要對不同的狀況下採取不同的操作。例如程式的執行平台具有這種多樣性,我們在window平台下編寫的程式,可能使用某乙個庫或者與硬體相關的屬性、方法。現在要將我們的程式移植到別的計算機系統的時候,例如linux系統。那麼程式上依賴的庫或者有些和硬體相關聯的屬性和方法不得不更改,那麼我們只能在編寫程式的時候提高程式的健壯性,此時就需要條件編譯語句為我們實現這樣的功能。

我們還見過這樣的語句段:

#ifndef 標誌符

#define 標誌符1

#else

#define 標誌符1

#endif

或許上面的說法讓你有點困惑,還是舉個例子吧!

#ifndef   pi

#define doublepi 3.14*2

#else

#define doublepi  pi*2

#endif

問題出現了,為什麼不先直接#define pi 3.14,然後在定義doublepi呢?

這就是為了防止變數的重複定義。其實#ifndef的最主要目的是防止標頭檔案的重複包含和編譯。那麼標頭檔案的重複包含和編譯有什麼危害嗎?

有危害是明顯的,要不然費這麼大勁幹嘛呢?其實重複包含標頭檔案有以下問題:

使預處理的速度變慢了,要處理很多本來不需要處理的標頭檔案

可能預處理器就陷入死迴圈了(其實編譯器都會規定乙個包含層數的上限)。例如h1.h包含h2.hh2.h又包含h1.h的情況,如果不採用防止標頭檔案的重複定義,那麼預處理器就會進入死迴圈了。

標頭檔案裡有些**不允許重複出現。而重複定義標頭檔案會重複出現一些**。(雖然變數和函式允許多次宣告(只要不是多次定義就行),但標頭檔案裡有些**是不允許多次出現的)。例如:使用typedef型別定義和結構體tag定義等,在乙個程式檔案中只允許出現一次。

static的作用以及實驗

1 靜態區域性變數 普通的區域性變數在棧空間上分配,這個區域性變數所在的函式被多次呼叫時,每次呼叫這個區域性變數在棧上的位置都不一定相同。區域性變數也可以在堆上動態分配,但是記得使用完這個堆空間後要釋放之。static區域性變數中文名叫靜態區域性變數。它與普通的區域性變數比起來有如下幾個區別 位置 ...

stdafx h的作用以及原理

vc工程裡面經常見到stdafx.h這個標頭檔案,以前也沒有特別注意,但是這個檔案用不好經常會出錯,所以就google了一下,總算是弄清楚了。所謂標頭檔案預編譯,就是把乙個工程 project 中使用的一些mfc標準標頭檔案 如windows.h afxwin.h 預先編譯,以後該工程編譯時,不再編...

vuex namespaced的作用以及使用方式

vuex中的store分模組管理,需要在store的index.js中引入各個模組,為了解決不同模組命名衝突的問題,將不同模組的namespaced true,之後在不同頁面中引入getter actions mutations時,需要加上所屬的模組名 1 宣告分模組的store時加上namespa...