//在#define中,標準只定義了#和##兩種操作。#用來(lái)把參數轉換成字符串,##則用來(lái)連接兩個(gè)前后兩個(gè)參數,把它們變成一個(gè)字符串。
#define Conn(x,y) x##y //連接x,y
#define ToChar(x) #@x //加單引號
#define ToString(x) #x //加雙引號
最近看com相關(guān)的資料,看到CCmdTarget實(shí)現com接口的時(shí)候,去讀了一些宏的定義,在afxdisp.h頭文件中
#define BEGIN_INTERFACE_PART(localClass, baseClass) \
class X##localClass : public baseClass \
本來(lái)這個(gè)宏定義很容易理解的,但是這里多出個(gè)X##,我真沒(méi)見(jiàn)過(guò)這種用法,不曉得它是什么用意。
后來(lái)問(wèn)了幾個(gè)朋友也都不知道。
你知道么?
也許你也不知道~呵呵,最后我還是找到了相關(guān)的資料,解讀了這個(gè)define,還順便認識了另外兩個(gè)不常用的define
#define Conn(x,y) x##y
#define ToChar(x) #@x
#define ToString(x) #x
x##y表示什么?表示x連接y,舉例說(shuō):
int n = Conn(123,456); 結果就是n=123456;
char* str = Conn("asdf", "adf")結果就是 str = "asdfadf";
怎么樣,很神奇吧
再來(lái)看#@x,其實(shí)就是給x加上單引號,結果返回是一個(gè)const char。舉例說(shuō):
char a = ToChar(1);結果就是a='1';
做個(gè)越界試驗char a = ToChar(123);結果是a='3';
但是如果你的參數超過(guò)四個(gè)字符,編譯器就給給你報錯了!error C2015: too many characters in constant :P
最后看看#x,估計你也明白了,他是給x加雙引號
char* str = ToString(123132);就成了str="123132";
最后留幾個(gè)小試驗給大家去測測:
#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));
結果會(huì )如何呢? 嘿嘿嘿嘿~
其他一些雜七雜八的東西:
我先定義了一個(gè)宏
#define TE text
我想再定義一個(gè)宏,能將TE變?yōu)樽址?text").
即定義:
#define STR(str) ??? //使用STR(TE)時(shí)能替換為"text"。
請問(wèn)???部分怎么實(shí)現呢?用#str是達不到目的的了,用'"'##str##'"'也不對。
#不能做二次替換,可以再定義一個(gè)中間宏
#define TE text
#define AD TE
#define STR(AD) #AD
試試
直接定義兩個(gè)宏得了!
#define TE text
#define TE_S "text"
#define STR abc
char arr[10] = "STR";
為什么arr數組中是STR而不是abc,define不是簡(jiǎn)單的字符替換嗎?
#define A "aaa"
#define B "bbb"A
我對macro這個(gè)東西不大熟悉……不過(guò)這樣可以成功printf("%s\n",B);
在#define中,標準只定義了#和##兩種操作。#用來(lái)把參數轉換成字符串,##則用來(lái)連接兩個(gè)前后兩個(gè)參數,把它們變成一個(gè)字符串。
#include <stdio.h>
#define paster( n ) printf( "token " #n" = %d\n ", token##n )
int main()
{
int token9=10;
paster(9);
return 0;
}
輸出為
[leshy@leshy src]$ ./a.out
token 9 = 10
補充一點(diǎn): 在用#define 定義時(shí) ,可以用斜杠("\") 續行.與vb中的下劃線(xiàn)(" _")作用同.
比如:
#define add1( x, y ) ( x + y)
也可以表示成 :
#define add1(x,y) \
(x + y )
3個(gè)普通用法
1.
C: #define X 100 ----> C++: const int x=100;
2.
C: #define MAX(a,b) ((a)>(b)?(a):(b))
C++: inline int max(int a,int b){ return a>b?a:b;}
3.
#ifndef NULL
#define NULL ((void*)0)
#endif
#ifndef _myheadfile_h
#define _myheadfile_h
#endif
聯(lián)系客服