首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

高分#define有关问题

2012-02-24 
高分求助#define问题在一个地方进行了如下定义:#defineWSMFpropertyDef(PN,PT,WorkVal)\WSDLEX32staticvoi

高分求助#define问题
在一个地方进行了如下定义:
#define   WSMFpropertyDef(PN,PT,WorkVal)   \
    WSDLEX32   static   void   _set_p_w     ##   WorkVal(void*   ptr,void*   data);   \
    WSDLEX32   static   void   _get_def_w   ##   WorkVal(void*   ptr);   \
    WSDLEX32   static   void   _get_p_w     ##   WorkVal(void*   ptr,void*   data);   \
    WSDLEX32   virtual   void   setWork   ##   PN   (PT);   \
    WSDLEX32   virtual   void   getWork   ##   PN   (PT*)
#endif

在另一个地方进行了如下引用:
WSMFpropertyDef(WSNlabelString,   char*,   _label_string   );

其中_label_string是char*型,WSNlabelString也是一个预定义的宏名返回值也是char*型。

请问上面那段宏定义是什么意思?特别是那里的“##”是什么意思?

谢谢先!·

[解决办法]
用一个宏同时声明多个函数
[解决办法]
http://topic.csdn.net/t/20050922/11/4286301.html
[解决办法]
## 是宏连接符,即
a ## b ==> ab

[解决办法]
就是用一个宏,定义一系列函数,其中函数的名子由宏的参数决定。
##起字符串连接的作用,比如
WSMFpropertyDef(WSNlabelString, char*, _label_string );
替换后地一行会成为
WSDLEX32 static void _set_p_w_label_string(void* ptr,void* data);
^^^^^^^^^^^^^
参数里的_label_string
[解决办法]
#是字符串
##是连接两个参数

///////////////////////
#include <iostream>
using namespace std;

#define TEST(pid) (cout < <para##pid < <endl);
#define TEST2(p) (cout < <#p < <endl);
int main()
{
int para3 = 3;
int para2 = 2;
TEST(2); // <==> cout < <para2 < <endl;
TEST(3); // <==> cout < <para3 < <endl;

TEST2(test) // <==> cout < < "test " < <endl;
TEST2( "test2 "); // <==> cout < < " "test2 " " < <endl;
system( "pause ");
return 0;
}
[解决办法]
# 是粘贴符
#define _T(x) L##x 就是通过用黏贴L把普通字符串转换为UNICODE版本
[解决办法]
有时候,你会想要根据需求声明特定的函数,比如,你想在2个程序里,分别声明

LoveXXX()

这样的函数,XXX部分根据需求而定,那么你就可以定义这样的宏

#define mydef(var) Love ## var();

这样当你写
mydef(GirlA)
就等于写了
LoveGirlA();

当你写
mydef(LoliB)
就等于写了
LoveLoliB();

然后,\,反斜杠,这个是连字符。因为宏定义只能写在一行上,但是都写一行上不利于阅读。比如:

#define mydef(var) Love ## var(); Touch ## var(); Hug ## var(); Kiss ## var();

所以用这个来表示一行没有结束,后面还是在同一行上,这样就可以一次声明多个函数

#define mydef(var) \
Love ## var(); \
Touch ## var(); \
Hug ## var(); \
Kiss ## var();

基本用法就是这样。但是##和\的应用并不限于声明函数而已,也可以用来在宏里实现函数,实现class,都没有问题。一切都看你的技术和手段了,呵呵。
[解决办法]
## 就是字符串连接 A##B -> AB
[解决办法]
经常性的查询 msdn 或者其他帮助手册

热点排行