最近看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)
留言列表