预处理运算符意义
#字符串化运算符
##连接运算符
#@字符化运算符

1.#

在类函数宏(function-like macro)的替换部分中,“#”符号用作一个预处理运算符,它可以把语言符号(token)转化为字符串。例如,如果 x 是一个宏参量,那么 #x 可以把参数名转化为相应的字符串。该过程称为字符串化。

#include <stdio.h>   
#define PSQR(x) printf("The square of " #x " is %d. /r/n", (x) * (x))   
   
int main(void)  
{  
    int y = 5;   
      
    PSQR(y);  
    PSQR(2 + 4);   
   
    return 0;   
}  
   
// 输出:  
The square of y is 25.     // 用 "y" 代替 #x   
The square of 2 + 4 is 36. // 用 "2 + 4" 代替 #x  

2.##

和 # 运算符一样,## 运算符可以用于类函数宏的替换部分。另外,## 运算符还可用于类对象宏(object-like macro)的替换部分。这个运算符把两个语言符号组合成单个语言符号。

#include <stdio.h>   
#define XNAME(n) x ## n   
#define PRINT_XN(n) printf("x" #n " = %d/r/n", x ## n);   
   
int main(void)  
{  
    int XNAME(1) = 14; // 变为 int x1 = 14;   
    int XNAME(2) = 20; // 变为 int x2 = 20;   
    PRINT_XN(1)        // 变为 printf("x1 = %d/r/n", x1);   
    PRINT_XN(2)        // 变为 printf("x2 = %d/r/n", x2);   
   
    return 0;   
}  
   
// 输出:  
x1 = 14   
x2 = 20   

3.#@

用于创建一个字符,类似 ## ,注: 非 ANSI-C中的特性,GCC不支持,VC可以; 使用实例如下:


#include<stdio.h>

#define Dump_Str(s) printf("%s = %s\n",#s,s); 
#define Dump_Char(c)  #@c
int main()
{
	printf("%c\n",Dump_Char(g));	//g
	printf("%c\n",Dump_Char(guix));	//x   可以输入 4个长度的字符,但只输出最后一位
	printf("%c\n",Dump_Char(  guix  ));	//x  默认去除前后空格,保留中间空格
	printf("%c\n",Dump_Char(guixu));	//error C2015: too many characters in constant	
}


更多推荐