这里求电脑高手qq多 看不懂求解释。。。

后使用快捷导航没有帐号?
查看: 609|回复: 4
&&此帖已结(5)
最后登录在线时间54小时45分注册时间阅读权限50精华0积分477帖子本月在线1小时0分
资深技术员, 积分 477, 距离下一级还需 23 积分
积分477帖子本月在线1小时0分
专家等级: 结帖率:72%
后面的两个##是什么意思,求大神赐教
附件: 你需要才可以下载或查看附件。没有帐号?
最佳答案+5
符号链接操作符
百度一下http://blog.csdn.net/xdso ...
最后登录在线时间55小时50分注册时间阅读权限30精华0积分194帖子本月在线0小时45分
中级技术员, 积分 194, 距离下一级还需 106 积分
积分194帖子本月在线0小时45分
专家等级: 结帖率:100%
符号链接操作符& &百度一下,看对你是否有用。
最后登录在线时间54小时45分注册时间阅读权限50精华0积分477帖子本月在线1小时0分
资深技术员, 积分 477, 距离下一级还需 23 积分
积分477帖子本月在线1小时0分
专家等级: 结帖率:72%
1、# (stringizing)字符串化操作符。其作用是:将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串。其只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前。
#define example(instr) printf(&the input string is:/t%s/n&,#instr)
#define example1(instr) #instr
当使用该宏定义时:
example(abc); 在编译时将会展开成:printf(&the input string is:/t%s/n&,&abc&);
string str=example1(abc); 将会展成:string str=&abc&;
对空格的处理
a。忽略传入参数名前面和后面的空格。
& &如:str=example1(& &abc ); 将会被扩展成 str=&abc&;
b.当传入参数名间存在空格时,编译器将会自动连接各个子字符串,用每个子字符串中只以一个空格连接,忽略其中多余一个的空格。
& &如:str=exapme( abc& & def); 将会被扩展成 str=&abc def&;
2、## (token-pasting)符号连接操作符
宏定义中:参数名,即为形参,如#define sum(a,b) (a+b);中a和b均为某一参数的代表符号,即形式参数。
而##的作用则是将宏定义的多个形参成一个实际参数名。
#define exampleNum(n) num##n
int num9=9;
int num=exampleNum(9); 将会扩展成 int num=num9;
1.当用##连接形参时,##前后的空格可有可无。
如:#define exampleNum(n) num ## n 相当于 #define exampleNum(n) num##n
2.连接后的实际参数名,必须为实际存在的参数名或是编译器已知的宏定义
// preprocessor_token_pasting.cpp
#include &stdio.h&
#define paster( n ) printf_s( &token& #n & = %d&, token##n )
int token9 = 9;
int main()
& &paster(9);
运行结果:
token9 = 9
另外,如果##后的参数本身也是一个宏的话,##会阻止这个宏的展开。
& & #define STRCPY(a, b)& & strcpy(a ## _p, #b)
& & int main()
& && &&&char var1_p[20];
& && &&&char var2_p[30];
& && &&&strcpy(var1_p, &aaaa&);
& && &&&strcpy(var2_p, &bbbb&);
& && &&&STRCPY(var1, var2);
& && &&&STRCPY(var2, var1);
& && &&&printf(&var1 = %s/n&, var1_p);
& && &&&printf(&var2 = %s/n&, var2_p);
& && &&&return 0;
& && &&&/* 注意这里 */
& && &&&STRCPY(STRCPY(var1,var2),var2);
& && &&&/* 这里是否会展开为: strcpy(strcpy(var1_p,&var2&)_p,&var2“)?
& && && &* 答案是否定的:
& && && &* 展开结果将是:&&strcpy(STRCPY(var1,var2)_p,&var2&)
& && && &* ## 阻止了参数的宏展开!
& && && &* 如果宏定义里没有用到 # 和 ##, 宏将会完全展开
& && && &*/
3、@# (charizing)字符化操作符。
只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前。作用是将传的单字符参数名转换成字符,以一对单引用括起来。
#define makechar(x)&&#@x
a = makechar(b);
展开后变成了:
4、/ 行继续操作符
当定义的宏不能用一行表达完整时,可以用&/&表示下一行继续此宏的定义。
另:关于其他网友对##和#的补充
1. 简单的说,“##”是一种分隔连接方式,它的作用是先分隔,然后进行强制连接。
& &其中,分隔的作用类似于空格。我们知道在普通的宏定义中,预处理器一般把空格
& &解释成分段标志,对于每一段和前面比较,相同的就被替换。但是这样做的结果是,
& &被替换段之间存在一些空格。如果我们不希望出现这些空格,就可以通过添加一些
& &##来替代空格。
& &另外一些分隔标志是,包括操作符,比如 +, -, *, /, [,], ...,所以尽管下面的
& &宏定义没有空格,但是依然表达有意义的定义: define add(a, b)&&a+b
& &而其强制连接的作用是,去掉和前面的字符串之间的空格,而把两者连接起来。
2. 举列 -- 试比较下述几个宏定义的区别
& &#define A1(name, type)&&type name_##type##_type 或
& &#define A2(name, type)&&type name##_##type##_type
& &A1(a1, int);&&/* 等价于: int name_int_ */
& &A2(a1, int);&&/* 等价于: int a1_int_& &*/
& && &&&1) 在第一个宏定义中,&name&和第一个&_&之间,以及第2个&_&和第二个
& &&type&之间没有被分隔,所以预处理器会把name_##type##_type解释成3段:
& &“name_”、“type”、以及“_type”,这中间只有“type”是在宏前面出现过
& & 的,所以它可以被宏替换。
& && &&&2) 而在第二个宏定义中,“name”和第一个“_”之间也被分隔了,所以
& &预处理器会把name##_##type##_type解释成4段:“name”、“_”、“type”
& &以及“_type”,这其间,就有两个可以被宏替换了。
& && &&&3) A1和A2的定义也可以如下:
& && && &&&#define A1(name, type)&&type name_&&##type ##_type&&
& && && && && && && && && && && && &&&&##前面随意加上一些空格&
& && && &&&#define A2(name, type)&&type name ##_ ##type ##_type
& & 结果是## 会把前面的空格去掉完成强连接,得到和上面结果相同的宏定义
3. 其他相关 -- 单独的一个 #
& &至于单独一个#,则表示 对这个变量替换后,再加双引号引起来。比如
& && &#define&&__stringify_1(x)& &#x
& && &__stringify_1(linux)& &&==&&&&linux&
所以,对于MODULE_DEVICE_TABLE
& &&&1) #define MODULE_DEVICE_TABLE(type,name)& && && && && && && && &
& && && && & MODULE_GENERIC_TABLE(type##_device,name)
& &&&2) #define MODULE_GENERIC_TABLE(gtype,name)& && && && && && && &
& && && && & extern const struct gtype##_id __mod_##gtype##_table& &&&
& && && && & __attribute__ ((unused, alias(__stringify(name))))
& && &MODULE_DEVICE_TABLE(usb, products)&&
& && && && && && && && && &&&/*notes: struct usb_device_ */
&==& MODULE_GENERIC_TABLE(usb_device,products)
&==& extern const struct usb_device_id __mod_usb_device_table& &&&
& && && && & __attribute__ ((unused, alias(&products&)))& &
注意到alias attribute需要一个双引号,所以在这里使用了__stringify(name)来
给name加上双引号。另外,还注意到一个外部变量&__mod_usb_device_table&被alias
到了本驱动专用的由用户自定义的变量products&usb_device_id类型&。这个外部变量
是如何使用的,更多的信息请参看《probe()过程分析》。
4. 分析方法和验证方式 -- 编写一个简单的C程序
& &用宏定义一个变量,同时用直接方式定义一个相同的变量,编译报告重复定义;
& &用宏定义一个变量,直接使用该宏定义的变量名称,编译通过且运行结果正确;
& &使用printf打印字符串数据。printf(&token macro is %s&, __stringify_1(a1));
最后登录在线时间54小时45分注册时间阅读权限50精华0积分477帖子本月在线1小时0分
资深技术员, 积分 477, 距离下一级还需 23 积分
积分477帖子本月在线1小时0分
专家等级: 结帖率:72%
星辰yyt 发表于
符号链接操作符& &百度一下http://blog.csdn.net/xdsoft365/article/details/5911596,看对你是否有用。 ...
谢谢很有用,非常感谢
最后登录在线时间8小时15分注册时间阅读权限50精华0积分435帖子本月在线0小时15分
资深技术员, 积分 435, 距离下一级还需 65 积分
积分435帖子本月在线0小时15分
专家等级: 结帖率:0%
谢谢分享!!!
技术新星奖章
人才类勋章
时间类勋章
涓涓之细流
发帖类勋章
技术高手奖章
人才类勋章
1、活动时间:
即日起——日
2、奖品设置:
发表资料主题帖≥30个,最先申请领奖的前20名论坛用户,即可获得100元手机充值卡;
发表资料主题帖≥20个,最先申请领奖的前30名论坛用户,即可获得50元手机充值卡;
发表资料主题帖≥10个,最先申请领奖的前40名论坛用户,即可获得20元手机充值卡;
3、活动规则:
1、在TIMCU、TIDSP、TI模拟技术三个论坛以主题帖形式发布相关技术资料。
还在等什么~快来互换苹果吧~家电百科 产品:
> 美的多功能电热锅怎么看真假? 急求高手解释!
美的多功能电热锅怎么看真假? 急求高手解释! 常见问题
你找个的售后修理的,他们一打开就知道了。记得当初在网上买的豆浆机,坏了之后拿到售后去修,师傅打开后说,你这是网上买的吧,买到假货了。然后他就又给装起来了,不给修
" tab="tab_0" >常见问题热点事件家电人物家电名词热门品牌
热门新品12345678912345678910123 4 5 6 7 8 9 10求极限问题。。请问下面的图中怎么看不懂指数是怎么变化成那样的??请高手解释下。。为什么要这样化简_百度知道
提问者采纳
哦,这个简单,把整个作为一个自然对数的真数,然后再把这个对数,作为指数函数的指数,等价变换了下,后面那个变化是对数函数的基本性质变的log顶发侈菏侬孤畴酞川喀(a) M^n=nlog(a) M 再后面也是根据对数函数的基本性质变的log(a) (M÷N)=log(a) M-log(a) N
嗯,我明白了ln1/x
是如何变出-lnx了,,可是分母是怎么变出来的啊?
除一个x,再乘一个x,把乘那个x变成除以个1/x
提问者评价
其他类似问题
您可能关注的推广
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁求图形高手解释
这帖子实在看不懂
有关麦田怪圈_木渎中学吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:3,084贴子:
求图形高手解释
这帖子实在看不懂
有关麦田怪圈收藏
一楼给度娘
1楼 12:22&|
相关的贴子115635152相关的图贴
2楼 12:23&|
手机无力了
3楼 12:40&|来自
登录百度帐号推荐应用
内&&容:使用签名档&&
想了解更多关于 ”木渎中学“的信息,请&或}

我要回帖

更多关于 求电脑高手qq 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信