CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

一个关于define的问题,谢谢

楼主dhongda()2006-03-04 20:23:41 在 C/C++ / C语言 提问

#define   cat(x,y)   x##y   concatenates   x   to   y.   But   cat(cat(1,2),3)   does   not   expand  
   
    but   gives   preprocessor   warning.   Why?  
  问题点数:20、回复次数:7Top

1 楼cunsh(村少)回复于 2006-03-04 20:28:11 得分 0

你想做什么?Top

2 楼xiaocai0001(高楼目尽欲黄昏/梧桐叶上萧萧雨)回复于 2006-03-04 20:31:06 得分 1

像这种递归的宏展开,   编译器好像没能力去做.Top

3 楼dhongda()回复于 2006-03-04 20:48:21 得分 0

但是   如果改成#define   cat(x,y)   x+y     cat(cat(1,2),3)就可以了,也是低归的,就能通过编译Top

4 楼Slime_wu()回复于 2006-03-05 13:16:58 得分 2

等解答,帮顶  
   
   
  Top

5 楼adintr(www.adintr.com)(风流总被雨打风吹去)回复于 2006-03-05 14:13:18 得分 15

很简单,第一次展开后变为:  
  cat(1,2)3     注意,这中间没有空格,所以不能继续展开了。  
  这时已经出现了错误,编译器不会继续处理了。  
  你可以在程序里直接写   cat(1,2)3,   是无法通过的。  
  如果是加的话,   cat(1,2)+3   还可以继续进行预处理,所以可以通过啊Top

6 楼dx30611(想要clean code)回复于 2006-03-05 14:13:48 得分 1

LZ搞错了##的含义  
  #define   cat(x,y)   x+y是将cat(x,y)解释为x和y的数值相加  
  而#define   cat(x,y)   x##y是将cat(x,y)解释为x字符和y字符的相连也就是说cat(x,y)等同于xyTop

7 楼adintr(www.adintr.com)(风流总被雨打风吹去)回复于 2006-03-05 14:21:27 得分 1

我想这大概是因为编译器大多会把预处理和词法分析之类的一起完成,  
  所以多层的预处理需要保证每一次处理之后词法都是正确的。  
  如果单纯只进行预处理的话,   cat(1,2)3     这样的也是可以被替换出来的。Top

相关问题

  • #define
  • The problem in #define
  • #define ANSI??????我晕....
  • #define STRICT何用???
  • 奇怪的#define
  • question about define
  • #define _BKDIALOGST_H_ ??????
  • define和const
  • #define问题
  • #define 的问题

关键词

  • 编译器
  • cat
  • 预处理
  • 展开
  • define
  • 继续

得分解答快速导航

  • 帖主:dhongda
  • xiaocai0001
  • Slime_wu
  • adintr
  • dx30611
  • adintr

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo