"#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