c语言基础运算符(C编程技巧运算符)
一、运算符## 运算符用于在预处理期将宏参数转换为字符串# 的转换作用是在
一、运算符#
- # 运算符用于在预处理期将宏参数转换为字符串
- # 的转换作用是在预处理期完成的,因此只在宏定义中有效
示例如下
#include <stdio.h>
#define TO_STRING(s) #s
int main(void)
{
printf(TO_STRING(689754));
printf("\n");
return 0;
}
运行结果如下
该运算符用途就是字符串化。C语言允许在字符串中包含宏参数。例如,如果x是一个宏形参,那么#x就是转换为字符串“x”的形参名 。
示例如下:
#include <stdio.h>
#define square(x) printf("The square of " #x " is %d.\n",((x)*(x)))
int main(void)
{
int a = 9;
SQUARE(a);
SQUARE(5 4);
return 0;
}
运行结果如下
(*)
这里需要注意,#运算符是在预处理期间完成的,做了字符串化,而运算不是!
二、运算符##
- ## 运算符用于在预处理期粘连两个标识符
- ## 的连接作用是在预处理期完成的,因此只在宏定义中有效
示例如下
#include <stdio.h>
#define CONNECT_STRING(a,b) (a##b)
int main(void)
{
printf("value=%d\n", CONNECT_STRING(10, 50));
return 0;
}
运行结果如下
该运算符就是用于标识的拼接。一般在批量定义结构体或者函数时,用该运算符会比较省事。
三、注意事项
当宏参数是另一个宏的时候,凡是宏定义里有用“#”、“##”的地方,宏参数是不会再展开了!!!
示例如下
#include <stdio.h>
#define TO_STRING(s) #s
#define VALUE 100
int main(void)
{
printf(TO_STRING(VALUE));
printf("\n");
return 0;
}
运行结果如下
解决如下
#include <stdio.h>
#define _TO_STRING(s) #s
#define TO_STRING(s) _TO_STRING(s)
#define VALUE 100
int main(void)
{
printf(TO_STRING(VALUE));
printf("\n");
return 0;
}
运行结果如下
其实解决这个问题,就是加了一个中间转换层,让所有宏的参数在这里全部展开。
,