"#if #elseif #else #endif 的使用方式"

Home Home
引用 | 編輯 i-c0112
2011-01-19 18:03
樓主
推文 x0
前幾天要測試插件時卻無法compile
錯誤訊息:
<329> : erro 038: extra characters on line
出錯部分內容:
複製程式
#define DEBUG 1

...

/*327*/    #if DEBUG == 1
/*328*/        client_print(0, print_notify, msg2)
/*329*/    #elseif DEBUG >= 2
/*330*/        client_print(0, print_center, msg2)
/*331*/    #endif
問題好像出在 #elseif 的使用  #elseif 後面不接任何東西的話就可以compile了
實在不知道為什麼錯...Pawn_Language_Guide.pdf裡也是這麼用的= =
還是我的compiler有問題!?

獻花 x0
引用 | 編輯 SkY★NeT
2011-01-19 18:13
1樓
  
else if不是分開的嗎? 表情

獻花 x1
引用 | 編輯 i-c0112
2011-01-19 19:25
2樓
  
下面是引用 a97444039 於 2011-01-19 18:13 發表的 : 到引言文
else if不是分開的嗎? 表情
稍微注意一下...就會發現它前面有 '#'
你所說的跟這個是不一樣的...

獻花 x0
引用 | 編輯 史來姆
2011-01-19 19:35
3樓
  
為甚麼你要這樣寫呢?
#define DEBUG 1
....

if (DEBUG>=1)
xxxx
else if (DEBUG>=2)
yyyyy

這樣不行麼?

獻花 x1
引用 | 編輯 i-c0112
2011-01-19 21:14
4樓
  
下面是引用 史來姆 於 2011-01-19 19:35 發表的 : 到引言文
為甚麼你要這樣寫呢?
#define DEBUG 1
....

if (DEBUG>=1)
xxxx
else if (DEBUG>=2)
yyyyy

這樣不行麼?
這樣是的確可以...但是跟我想要的執行流程不同表情
用 #if 的話只會在編譯時判斷  而轉成amxx檔後是只會留下條件成立時 #if 區塊內的內容
要是每次都判斷的話 執行效率上是有差的

獻花 x0
引用 | 編輯 e1242656
2011-01-20 14:42
5樓
  

都好深奧喔
我一個都看不懂......

獻花 x0
引用 | 編輯 a7811311622
2011-01-20 17:28
6樓
  
大概是因為…「#define」寫出來的都是定值…是不會變化的…
畢竟用到「#elseif」代表這數值存在著變化…
所以「拿判斷式來判斷一個不可能會變化的值」這點可能有問題吧…

獻花 x1
引用 | 編輯 i-c0112
2011-01-21 00:23
7樓
  
下面是引用 a7811311622 於 2011-01-20 17:28 發表的 : 到引言文
大概是因為…「#define」寫出來的都是定值…是不會變化的…
畢竟用到「#elseif」代表這數值存在著變化…
所以「拿判斷式來判斷一個不可能會變化的值」這點可能有問題吧…
但是我換成
#elseif  true
竟然也錯呢...而且換成變數也是一樣...似乎後面接了東西就無法compile
所以才對這問題感到不解表情

獻花 x0
引用 | 編輯 a7811311622
2011-01-21 01:00
8樓
  
下面是引用 i-c0112 於 2011-01-21 00:23 發表的 : 到引言文

但是我換成
#elseif  true
竟然也錯呢...而且換成變數也是一樣...似乎後面接了東西就無法compile
所以才對這問題感到不解表情

話說…「true」是布林值「變數」…這和我上面說的有差異嗎…?表情

獻花 x0
引用 | 編輯 i-c0112
2011-01-21 01:39
9樓
  
下面是引用 a7811311622 於 2011-01-21 01:00 發表的 : 到引言文
 
話說…「true」是布林值「變數」…這和我上面說的有差異嗎…?表情
你不是要我判斷會變化的數嗎...看來我理解力很差表情

獻花 x0
引用 | 編輯 z1022001
2011-01-21 08:14
10樓
  
會不會是要寫成:?
/*327*/   #if DEBUG == 1
/*328*/     client_print(0, print_notify, msg2)
/*329*/   #elseif DEBUG >= 2
...

獻花 x0
引用 | 編輯 i-c0112
2011-01-21 11:46
11樓
  
下面是引用 z1022001 於 2011-01-21 08:14 發表的 : 到引言文
會不會是要寫成:?
/*327*/   #if DEBUG == 1
/*328*/       client_print(0, print_notify, msg2)
/*329*/   #elseif DEBUG >= 2
...
我原本就是這樣寫啊...我頂樓好像打錯了...改一下表情

獻花 x2
引用 | 編輯 a7811311622
2011-01-21 12:32
12樓
  
下面是引用 i-c0112 於 2011-01-21 01:39 發表的 : 到引言文

你不是要我判斷會變化的數嗎...看來我理解力很差表情

算了…那不重要…反正剛才自己不小心推翻自己的說法了…
目前我是知道為何會編譯錯誤了…原因其實是…邏輯錯誤…
如果你改成:
複製程式
 
#define DEBUG 1 
#if DEBUG >= 2 
#elseif DEBUG >= 1 
#endif 

這樣編譯就沒問題了…至於為何你原本的寫法會錯誤…?
原因是:
複製程式
 
//當 DEBUG >= 1 時早就包括 DEBUG >= 2 的內容了… 
//所以編譯時才會出現錯誤「extra characters on line」…因為以邏輯上來說這行的確是多餘的… 
#if DEBUG >= 1 
#elseif DEBUG >= 2 
#endif 

//當 DEBUG >= 2 時並不包括 DEBUG >= 1 的內容了… 
//因為有唯一的例外:DEBUG == 1 ,所以邏輯上沒錯誤… 
#if DEBUG >= 2 
#elseif DEBUG >= 1 
#endif 



後來又發現上面說法又被推翻了…好像不是邏輯的問題…表情
如果將原本的寫法改成:
複製程式
 
#define DEBUG 1 
#if DEBUG >= 2 
#elseif DEBUG == 1 
#endif 

這樣也不會編譯錯誤…目前又只能猜測…
「#if」裡比較的內容要大於「#elseif」裡比較的內容?
表情  表情 表情

獻花 x0
引用 | 編輯 i-c0112
2011-01-21 14:56
13樓
  
下面是引用 a7811311622 於 2011-01-21 12:32 發表的 : 到引言文
 
算了…那不重要…反正剛才自己不小心推翻自己的說法了…
目前我是知道為何會編譯錯誤了…原因其實是…邏輯錯誤…
如果你改成:
.......
這個現象好像是這樣的:
 當#if 的條件達成時
 #elseif 就會出錯

因為我照大大的改是可以compile 但是改成 #define DEBUG 2後又不行了...
所以我只好改成這樣了...變得比較麻煩
複製程式
#define DEBUG 2

#if DEBUG >= 2
    say_hello(0)
#else
    #if DEBUG == 1
        say_hi(0)
    #endif
#endif


獻花 x0
引用 | 編輯 z1022001
2011-01-21 17:28
14樓
  
下面是引用 a7811311622 於 2011-01-21 12:32 發表的 : 到引言文
 
算了…那不重要…反正剛才自己不小心推翻自己的說法了…
目前我是知道為何會編譯錯誤了…原因其實是…邏輯錯誤…
如果你改成:
[code]
.......

看來是:
第二個條件的集合
不能全屬於第一個條件的集合
感覺上最穩當的方法就是
兩個條件是完全無交集的兩個集合比較好

獻花 x0
引用 | 編輯 zdt
2011-01-29 22:22
15樓
  
这太高深了!不懂

獻花 x1