[問題] #ifndef 跟用if的差別

看板C_and_CPP作者 (nikeasyanzi)時間12年前 (2013/10/17 23:02), 編輯推噓5(5023)
留言28則, 15人參與, 最新討論串1/1
看到一個題目問說 #ifndef (WIN32) //do something #endif 跟 if(WIN32){ //do something } 想請問 版上先進 這兩者差別在哪?? 我只知道 通常用#ifdef (WIN32) 是用來判別系統 是win or linux 根據系統(win or linux)的不同做不同的動作 那就前置處理器 跟一般if-else語法 使用時機有差嗎@@? 懇請賜教 謝謝!! -- CyberPanel 5000CP 換 NT.500 http://myurl.com.tw/05bd EmailCash 5000e 換 NT.500 http://myurl.com.tw/rgdq -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.251.211.120 ※ 編輯: nikeasyanzi 來自: 111.251.211.120 (10/17 23:05) ※ 編輯: nikeasyanzi 來自: 111.251.211.120 (10/17 23:06) ※ 編輯: nikeasyanzi 來自: 111.251.211.120 (10/17 23:10)

10/17 23:15, , 1F
if (WIN32) {} 裡面若是包含了不存在 Windows 上的
10/17 23:15, 1F

10/17 23:16, , 2F
function call 或 include 不存在的 .h 會有 error
10/17 23:16, 2F

10/17 23:21, , 3F
if(WIN32) 如果沒定義呢? 邊議會錯吧!
10/17 23:21, 3F

10/17 23:25, , 4F
if() 裡面的expression沒定義, compiler就不會過吧
10/17 23:25, 4F

10/17 23:31, , 5F
兩個是在不同時候處理的,差蠻多的喔
10/17 23:31, 5F

10/17 23:40, , 6F
#的是直接判斷有無,有就把程式碼包進來,沒有就拿掉
10/17 23:40, 6F

10/17 23:40, , 7F
if 是在執行階段才判斷,如果有定義就一樣,沒定義
10/17 23:40, 7F

10/17 23:40, , 8F
compiler就會出錯,不像#會直接忽略
10/17 23:40, 8F

10/17 23:46, , 9F
感謝樓上幾位跟cutekid 大 熱心告知
10/17 23:46, 9F

10/17 23:47, , 10F
所以 應該是用If-else 比較好囉?
10/17 23:47, 10F

10/17 23:48, , 11F
畢竟complier 可以幫我偵錯? 是這樣嗎XD
10/17 23:48, 11F

10/17 23:55, , 12F
測試的時候#是很好用的
10/17 23:55, 12F

10/18 00:14, , 13F
沒有哪個比較好 用途根本不一樣
10/18 00:14, 13F

10/18 00:54, , 14F
#if比較偏向於編譯器虛指令
10/18 00:54, 14F

10/18 01:17, , 15F
#if根本不是個指令 偏向何謂也
10/18 01:17, 15F

10/18 02:22, , 16F
preprocessor 完才會進 compiler,不用想奇奇怪怪的名詞
10/18 02:22, 16F

10/18 02:23, , 17F
這是 C/C++ 很了不起的設計 XD
10/18 02:23, 17F

10/18 02:26, , 18F
通常會看 _WIN32 有沒有被定義來決定 OS 是不是 Windows
10/18 02:26, 18F

10/18 02:27, , 19F
Example: http://ppt.cc/jOCG (Chromium project)
10/18 02:27, 19F

10/18 09:42, , 20F
兩個不同的東西怎麼不比.......
10/18 09:42, 20F

10/18 09:43, , 21F
怎麼能比
10/18 09:43, 21F

10/18 10:37, , 22F
上面或許真的沒遇過真的吃#開頭指令的詭異C編譯器 XD
10/18 10:37, 22F

10/18 12:07, , 23F
preprocessor是很糟糕的設計,但畢竟是數十年前的產物
10/18 12:07, 23F

10/18 12:12, , 24F
新的語言多半不再有preprocessor,全部給compiler包辦
10/18 12:12, 24F

10/18 19:28, , 25F
咦 那不就是有 preprocessing 功能的 compiler 嗎 XD
10/18 19:28, 25F

10/18 20:14, , 26F
#pragma 給誰看?
10/18 20:14, 26F

10/19 06:10, , 27F
#if在cross compiler用途很大
10/19 06:10, 27F

11/24 17:42, , 28F
前置除理器優先處理在前,runtime 的條件判斷式則編譯在後
11/24 17:42, 28F
文章代碼(AID): #1IN_lzES (C_and_CPP)