C/C++ 宏中“#"和"##”的常见用法

来源:互联网 发布:平面设计和美工的区别 编辑:程序博客网 时间:2024/05/21 12:40

一般用法

通常情况我们一般把宏#参数变为一个字符串,形如:123--->”123”,当然这种转换方法很多譬如:itoa,sprintf等函数都可以完成,但是如果频繁的调用这些系统调用的话,会造成较大的系统开销,使用宏#不失为一种高效便捷的手段,

##把两个宏参数贴合在一起.

简单的方法。

#include<stdio.h>

#define STR(s) #s

#define CONS(x,y) (int)(x##e##y)

int main()

{

        printf("%s\n",STR(123));

        Printf(“%d\n”,CONS(3,3));

        return 0;

}

     

--------下面是执行结果

./a.out

123

3000

'#''##'的一些应用特例

1. 合并匿名变量名

#define  ___ANONYMOUS1(type, var, line)  type  var##line

#define  __ANONYMOUS0(type, line)  ___ANONYMOUS1(type, _anonymous, line)

#define  ANONYMOUS(type)  __ANONYMOUS0(type, __LINE__)

 

 

例:

ANONYMOUS(static int);  : static int _anonymous70;  70表示该行行号;

第一层:ANONYMOUS(static int);  -->  __ANONYMOUS0(static int, __LINE__);

第二层:                        -->  ___ANONYMOUS1(static int, _anonymous, 70);

第三层:                        -->  static int  _anonymous70;

即每次只能解开当前层的宏,所以__LINE__在第二层才能被解开;

2. 填充结构

#define  FILL(a)    {a, #a}

enum IDD{OPEN, CLOSE};

typedef struct MSG{

  IDD id;

  const char * msg;

}MSG;

 

MSG _msg[] = {FILL(OPEN), FILL(CLOSE)};

相当于:

MSG _msg[] = {{OPEN, "OPEN"},

             {CLOSE, "CLOSE"}};

3. 记录文件名

#define  _GET_FILE_NAME(f)    #f

#define  GET_FILE_NAME(f)    _GET_FILE_NAME(f)

static char  FILE_NAME[] = GET_FILE_NAME(__FILE__);

4. 个人文库地址:

http://wenku.baidu.com/p/helpylee




0 0