Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1833626
  • 博文数量: 195
  • 博客积分: 4227
  • 博客等级: 上校
  • 技术积分: 2835
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-04 10:39
文章分类

全部博文(195)

文章存档

2013年(1)

2012年(26)

2011年(168)

分类:

2011-04-06 16:16:29

第1篇

在C/C++的宏定义中,#/##存在特殊的作用1. #运算符将一个宏的参数转换为字符串字面量。它仅允许出现在带参数的宏的替换列表中。
  1. #include   
  2. #define PRINT_STR(s)      printf(#s" = %s\n", s)  
  3. int main()   
  4. {   
  5.     char *s1 = "aaa";  
  6.     PRINT_STR(s1);  
  7.     return 0;   
  8. }   
输出:s1 = aaa注:printf(#s" = %s\n", s) -> printf(s1" = %s\n", s1) -> printf("s1 = %s\n", s1)->printf("s1 = %s\n", "aaa")#s只是做宏参数字面替换s则仍然是一个变量名2.##运算符可以将两个记号(例如标识符)“粘”在一起,成为一个记号。(无需惊讶,##运算符被称为“记号粘合”。)如果其中一个操作数是宏参数,“粘合”会在当形式参数被相应的实际参数替换后发生。
  1. #include   
  2. #define PRINT_STR(i)      printf("str = %s\n", s##i)  
  3. int main()   
  4. {   
  5.     char *s1 = "s1";  
  6.     char *s2 = "s2";  
  7.     char *s3 = "s3";  
  8.    
  9.     PRINT_STR(1);  
  10.     PRINT_STR(2);  
  11.     PRINT_STR(3);  
  12.    
  13.     return 0;   
  14. }   
输出:str = s1
str = s2
str = s3
3.C99的复杂宏:可变参数
  1. #include   
  2. #define PRINT_STR(format, ...)      do{printf(format, __VA_ARGS__);}while(0)  
  3. int main()   
  4. {   
  5.     char *str1 = "s1";  
  6.     char *str2 = "s2";  
  7.    
  8.     PRINT_STR("str1 is %s \nstr2 is %s\n",str1, str2);  
  9.    
  10.     return 0;   
  11. }  
输出:str1 is s1
str2 is s2
but attention!
  1. #include   
  2. #define PRINT_STR(format, ...)      do{printf(format, __VA_ARGS__);}while(0)  
  3. int main()   
  4. {   
  5.     char *str1 = "s1";  
  6.     char *str2 = "s2";  
  7.    
  8.     PRINT_STR("str1 is over\n");  
  9.    
  10.     return 0;   
  11. }   
编译:macro1.cpp: In function ‘int main()’:
macro1.cpp:8: error: expected primary-expression before ‘)’ token

这里提示错误,原因是少了变参列表,只有format参数,这里在format参数后就多了一个','。so,GNU CPP想出了一个特殊的##操作,没错,##操作又来了,但是不是上面的拼接行为了。如果可变参数被忽略或为空,“##”操作将使预处理器去除掉它前面的那个逗号。如果在宏调用时,确实提供了一些可变参数,GNU CPP也会工作正常,它会把这些可变参数放到逗号的后面。
  1. #include   
  2. #define PRINT_STR(format, ...)      do{printf(format, ##__VA_ARGS__);}while(0)  
  3. int main()   
  4. {   
  5.     char *str1 = "s1";  
  6.     char *str2 = "s2";  
  7.    
  8.     PRINT_STR("str1 is over\n");  
  9.    
  10.     return 0;   
  11. }   

输出:str1 is over




第2篇

在C/C++中,宏定义是由define完成的,define中有三个特殊的符号值得我们注意:

1. #:在宏展开的时候会将#后面的参数替换成字符串,如:

  #define p(exp) printf(#exp);

   调用p(asdfsadf)的时候会将#exp换成"asdfsadf"

2. ##:将前后两个的单词拼接在一起。例如《The C Programming Language》中的例子:

  #define cat(x,y) x##y

  调用cat(var, 123)展开后成为var123.

3. #@:将值序列变为一个字符

  #define ch(c) #@c

  调用ch(a)展开后成为'a'.

自己写了一小段测试程序:

#define A(a,b) a##b
#define B(a) #a
#define C(a) 

#include

using namespace std;

void main()
{
int v = 0,v1 = 1,v12 = 2;//v stands for var
cout << A(v1,2) << endl;
cout << B(v1) << endl;
cout << C(v) << endl;
}

结果为:

1

v1

v

阅读(1837) | 评论(0) | 转发(0) |
0

上一篇:container_of

下一篇:Android无法睡眠调试记录

给主人留下些什么吧!~~