免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3518 | 回复: 15
打印 上一主题 下一主题

请问宏定义 参数联接 ## 怎么用的啊? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-21 20:39 |只看该作者 |倒序浏览
我怎么也没有实验出来的
谁知道告诉下的 谢谢了

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2007-01-21 21:14 |只看该作者
你是咋试验的?

论坛徽章:
0
3 [报告]
发表于 2007-01-21 21:49 |只看该作者
#define LINK(X,Y) do{ printf("%s",(X)##(Y));}while(0);

void main()
{
char p = 'f';
char t = 'd';
LINK(p,t)
}

VC编译报错  term does not evaluate to a function

[ 本帖最后由 heavensword 于 2007-1-21 22:00 编辑 ]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2007-01-21 22:09 |只看该作者
你的用法不对。

#define LINK(X,Y) do{ printf("%s",X##Y);}while(0);

这样可以通过预处理,
不过编译时就会出错。
如果是gcc,你可以用gcc -E来看预处理后的结果。
vc我就不知是什么选项来看预处理后的内容。

论坛徽章:
0
5 [报告]
发表于 2007-01-21 22:40 |只看该作者
楼上这种用法是不是也有些问题?
#define LINK(X,Y) do{ printf("%s",X##Y);}while(0);

调LINK(p,t)
不是变成
do{ printf("%s",pt);}while(0);
了?
可这个变量不存在啊

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
6 [报告]
发表于 2007-01-21 22:42 |只看该作者
原帖由 goodloop 于 2007-1-21 22:40 发表
楼上这种用法是不是也有些问题?
#define LINK(X,Y) do{ printf("%s",X##Y);}while(0);

调LINK(p,t)
不是变成
do{ printf("%s",pt);}while(0);
了?
可这个变量不存在啊

所以我说编译会出错。
知道正确的用法和自己真正的想法很重要。

论坛徽章:
0
7 [报告]
发表于 2007-01-21 22:55 |只看该作者
原帖由 lenovo 于 2007-1-21 22:42 发表

所以我说编译会出错。
知道正确的用法和自己真正的想法很重要。

my fault
我看漏了

论坛徽章:
0
8 [报告]
发表于 2007-01-22 10:48 |只看该作者
Thanks a lot
now I know where I fault
but I want to

m_button[0] = (CButton*)GetDlgItem(IDC_STATIC0)
m_button[1] = (CButton*)GetDlgItem(IDC_STATIC1)
....
chang to maro

if I define
#define m_button_LINK(i) do{ m_button = (CButton*)GetDlgItem(IDC_STATIC##i);}while(0);

for(int i =0 ;i <10 ;i++)
    m_button_LINK(i)

but it will become IDC_STATICi

what i should to do ?

Thanks

[ 本帖最后由 heavensword 于 2007-1-22 21:29 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2007-01-22 11:09 |只看该作者
原帖由 lenovo 于 2007-1-21 22:09 发表
你的用法不对。

#define LINK(X,Y) do{ printf("%s",X##Y);}while(0);

这样可以通过预处理,
不过编译时就会出错。
如果是gcc,你可以用gcc -E来看预处理后的结果。
vc我就不知是什么选项来看 ...


#define LINK(X,Y) do{ printf("%s","X##Y");}while(0);

宏不像你们想象的智能

论坛徽章:
0
10 [报告]
发表于 2007-01-22 11:11 |只看该作者
举一个linux网络头文件中的例子:
typedef unsigned short int sa_family_t;

#define __SOCKADDR_COMMON(sa_prefix) \
        sa_family_t sa_prefix##family

宏 __SOCKADDR_COMMON(sa_prefix)的作用就是连接sam_prefix后面跟上family字符,
然后将其定义为sa_family_t类型,比如:
__SOCKADDR_COMMON(sin_)
那么也就是定义了:
sa_family_t sin_family;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP