close

最近看com相關的資料,看到CCmdTarget實現com介面的時候,去讀了一些宏的定義,在afxdisp.h頭文件中

#define BEGIN_INTERFACE_PART(localClass, baseClass) \
 class X##localClass : public baseClass \

本來這個巨集定義很容易理解的,但是這裏多出個X##,我真沒見過這種用法,不曉得它是什麼用意。
後 來問了幾個朋友也都不知道。

你知道麼?

也許你也不知道~呵呵,最後我還是找到了相關的資料,解讀了這個define,還 順便認識了另外兩個不常用的define

#define Conn(x,y) x##y
#define ToChar(x) #@x
#define ToString(x) #x

x##y表示什麼?表示x 連接y,舉例說:
int  n = Conn(123,456);  結果就是n=123456;
char* str = Conn("asdf", "adf")結果就是 str = "asdfadf";
怎麼樣,很神奇吧

再來看#@x,其實就是給x加上單引號,結果返回是一個const char。舉例說:
char a = ToChar(1);結果就是a='1';
做個越界試驗char a = ToChar(123);結果是a='3';
但是如果你的參 數超過四個字元,編譯器就給給你報錯了!error C2015: too many characters in constant   :P

最 後看看#x,估計你也明白了,他是給x加雙引號
char* str = ToString(123132);就成了str="123132";

最 後留幾個小試驗給大家去測測:
#define Dec(x,y) (x-y)
int n = Dec( A(123,1), 1230);
n = Conn(123, Conn(123,332) );
char* str = A("12", ToString( Dec(3,1));
結果會如何呢? 嘿嘿嘿嘿~

番外扁:
1. #define DBG(a...) printk("<TAG>" a)
2. #define DBG(a, ...) printk("<TAG>" a, __VA_ARGS__)
3. http://www.360doc.com/content/07/0423/16/3630_462811.shtml
3. http://www.dotblogs.com.tw/simplecestlavie/archive/2013/01/02/86637.aspx
4. http://msdn.microsoft.com/zh-tw/library/kb57fad8.aspx

 

Reference

http://msdn.microsoft.com/en-US/library/ms177415(v=vs.80)

 

 

arrow
arrow
    全站熱搜

    三原online 發表在 痞客邦 留言(0) 人氣()