必威体育Betway必威体育官网
当前位置:首页 > IT技术

#define中#和##的作用

时间:2019-07-23 03:12:12来源:IT技术作者:seo实验室小编阅读:62次「手机版」
 

define

#define f(a,b) a##b 

#define d(a) #a 

#define s(a) d(a) 

void main( void ) 

puts(d(f(a,b))); 

puts(s(f(a,b))); 

输出结果: 

f(a,b) 

ab

分析:  ##把两个符号连起来 

   #a指把a当成符号,就是把#后面的看成字符串

# 和 ## 操作符是和#define宏使用的. 使用# 使在#后的首个参数返回为一个带引号的字符串. 例如, 命令 

   #define to_string( s ) # s 

将会使编译器把以下命令 

   cout < < to_string( hello world! ) < < endl; 

理解为 

   cout < < "Hello World!" < < endl; 

使用##连结##前后的内容. 例如, 命令 

   #define concatenate( x, y ) x ## y 

... 

int xy = 10; 

... 

将会使编译器把 

   cout < < concatenate( x, y ) < < endl; 

解释为 

   cout < < xy < < endl; 

理所当然,将会在标准输出处显示'10'.

puts(d(f(a,b)));  ----> 因为d宏中的参数是另外一个宏,且带##,所以作为参数的宏不展开,相当于 

                    puts(#f(a,b));----->puts("f(a,b)"); 

puts(s(f(a,b))); ----> 因为s宏中的参数是另外一个宏,但不带##,所以作为参数的宏先展开,相当于 

                    puts(s(ab));----->puts(d(ab));---->puts(#ab);---->puts("ab");

#define f(a,b) a##b 

#define d(a) #a --》 以"#"开头的,直接替换,不展开:immediately replaced by the unexpanded actual argument 

#define s(a) d(a) --》 非以"#"开头的,先展开,再替换,也就是一般的情况 

所以就两种情况: 

1,不以"#"开头的,先展开参数a,然后是替换代码:puts(s(f(a,b)));-->puts(s(ab))-->puts(d(ab))-->puts("ab") 

2,以"#"开头的,直接替换,不展开:puts(d(f(a,b)))-->puts("f(a,b)")

相关阅读

undefined是什么?

undefined错误提示是我们上网,游戏,泡百度贴吧,微博,个人空间等经常碰到的问题,今天以百度贴吧为例,来简单说下undefined什么意思,是指

分享到:

栏目导航

推荐阅读

热门阅读