带参数的宏,有哪位高人能说说用法,该怎么解决

带参数的宏,有哪位高人能说说用法
例如:
下面两个宏
#define   DECLARE_DYNAMIC(class_name)   \
public:   \
static   CRuntimeClass   class##class_name;   \
virtual   CRuntimeClass*   GetRuntimeClass()   const;

#define   _IMPLEMENT_RUNTIMECLASS(class_name,base_class_name,wSchema,pfnNew)\
static   char   _lpsz##class_name[]   =   #class_name;   \
.......................................................(这个没写全)
特别问下一个#和两个##的区别。

------解决方案--------------------
#aaa
处理结果就是 "aaa "
aa##bb
处理结果就是 aabb
------解决方案--------------------
# Convert it into string
eg :
#3 --〉 “3”

## link string
------解决方案--------------------
当然不一样了。
class_name是一个符号,用#把符号转换成字符串。
_lpsz是固定不变的,class_name作为参数传进来,用##连接成新的变量名
------解决方案--------------------
## 是连接符号,其功能是在带参数的宏定义中将两个子串(token)联接起来,#符是把传递过来的参数当成字符串进行替代。

MSDN:

#define paster( n ) printf( "token " #n " = %d ", token##n )
同时又定义了一个整形变量:
int token9 = 9;
结果是:
printf( "token " "9 " " = %d ", token9 );
paster(9);”9”被当成了一个字符串,与”token”连接在了一起,从而成为了token9。而#n也被”9”所替代

------解决方案--------------------
举个例子class _name[]= "CApp "
展开
static char _lpsz##class_name[] = #class_name
如下
staic char _lpszCApp[] = "CApp "