没事研究下C#虚拟光驱,有所收获!
沒事研究下C#虛擬光驅,有所收獲!它被定義了,但它卻被定義為未定義——有趣的宏定義 前些日子為了弄清楚宏定義寫了個小程序,忽然發現將標識符定義為空和將標識符定義為未定義完全是兩碼事…虛擬光驅…然后發現原來宏定義中還有一種狀態叫“未定義”。下面就是那個小程序以及簡單的分析,然后通過這個程序可以充分體驗一下這個“未定義”的狀態,體驗一下什么叫“它被定義了,但它卻被定義為未定義”。
程序源碼:
view sourceprint?#include<stdio.h>?
??
int main()?
{?
#if (A == B)?
printf("define A = B/n");?
#elif (A == C)?
printf("define A = C/n");?
#else?
printf("nothing is defined!/n");?
#endif?
return 0;?
}
然后下面是編譯命令和運行結果:
[root@localhost test]# gcc definetest.c -o definetest
[root@localhost test]# ./definetest
define A = B
[root@localhost test]# gcc definetest.c -o definetest -DA
[root@localhost test]# ./definetest
nothing is defined!
[root@localhost test]# gcc definetest.c -o definetest -DA=C
[root@localhost test]# ./definetest
define A = B
[root@localhost test]# gcc definetest.c -o definetest -DA=C -DC
[root@localhost test]# ./definetest
define A = C
[root@localhost test]# gcc definetest.c -o definetest -DA=C -DB
[root@localhost test]# ./definetest
define A = C
首先簡單介紹一下gcc編譯時-D的意思,-D其實就是在預處理時進行宏定義,和在代碼中用#define實現的是一樣的。而D后面緊跟的就是宏定義的內容:-DA,相當于在代碼中#define A;而-DA=C就相當于在代碼中的#define A C。
首先第一種,也是最簡單的編譯方式,什么都沒有定義。但是卻在第一個分支執行了,這是為什么呢?因為這時A沒有被定義過,B也沒有被定義過,于是未定義等于未定義,于是在第一個分支中就執行了。
那這時候就會考慮怎么才能跑到第三個分支去呢?第二種編譯方式基本算是最簡單的解決方法了,宏定義A為空,然后A被定義為空,而B和C仍是未定義,于是就會跑到第三個分支。
第三種情況應該是最有意思的一種情況,大家一般都會認為程序應該會執行到第二個分支,打印出define A = C,但是卻仍在第一分支就實現了。其實這就是那種“它被定義了,但它卻被定義為沒定義”的情況,將A定義為C,但是C卻是“未定義”,于是A就變成了“未定義”,而B本身也是“未定義”,所以A就和B一樣了,所以在第一分支就實現了。
?然后這個時候如果把C定義一下,或者將B定義一下,只要保證兩者不都是“未定義”,就會進入到程序的第二分支了。分別對應第四和第五種編譯方式。
總結
以上是生活随笔為你收集整理的没事研究下C#虚拟光驱,有所收获!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vc2010中设置ipch与sdf的位置
- 下一篇: 为什么国内软件行业普遍不如国外?