加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

linux 中的## 和# 的作用

(2010-08-19 11:06:00)
标签:

杂谈

分类: Linux
 宏定义中##和#的作用
 内核中有很多的宏定义,在宏定义define中经常看到两个字符串##和#,现做一下说明:
 
 1. ##
    ##是一个连接符号,用于把参数连在一起
        例如:
            > #define  FOO(arg)   my##arg
       
            > FOO(abc)
        相当于   myabc
   
 
2.#:
是“字符串化”的意思。出现在宏定义中的#是把跟在后面的参数转换成一个字符串
        例如:
            > #define STRCPY(dst, src)   strcpy(dst, #src)
       
            > STRCPY(buff, abc)
        相当于   strcpy(buff, "abc")

3.注意事项:
另外,如果##后的参数本身也是一个宏的话,##会阻止这个宏的展开 。

4.例子:
举列 -- 试比较下述几个宏定义的区别

   #define A1(name, type)  type name_##type##_type 或
   #define A2(name, type)  type name##_##type##_type

   A1(a1, int); 
   A2(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

    结果是## 会把前面的空格去掉完成强连接,得到和上面结果相同的宏定义

单独的一个 #

   至于单独一个#,则表示 对这个变量替换后,再加双引号引起来。比如

      #define  __stringify_1(x)   #x
那么
      __stringify_1(linux)   <==>  "linux"

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有