c语言基础运算符(C编程技巧运算符)

一、运算符#

  • # 运算符用于在预处理期将宏参数转换为字符串
  • # 的转换作用是在预处理期完成的,因此只在宏定义中有效

示例如下

#include <stdio.h> #define TO_STRING(s) #s int main(void) { printf(TO_STRING(689754)); printf("\n"); return 0; }

运行结果如下

c语言基础运算符(C编程技巧运算符)(1)

该运算符用途就是字符串化。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; }

运行结果如下

c语言基础运算符(C编程技巧运算符)(2)

这里需要注意,#运算符是在预处理期间完成的,做了字符串化,而运算不是!

二、运算符##

  • ## 运算符用于在预处理期粘连两个标识符
  • ## 的连接作用是在预处理期完成的,因此只在宏定义中有效

示例如下

#include <stdio.h> #define CONNECT_STRING(a,b) (a##b) int main(void) { printf("value=%d\n", CONNECT_STRING(10, 50)); return 0; }

运行结果如下

c语言基础运算符(C编程技巧运算符)(3)

该运算符就是用于标识的拼接。一般在批量定义结构体或者函数时,用该运算符会比较省事。

c语言基础运算符(C编程技巧运算符)(4)

三、注意事项

当宏参数是另一个宏的时候,凡是宏定义里有用“#”、“##”的地方,宏参数是不会再展开了!!!

示例如下

#include <stdio.h> #define TO_STRING(s) #s #define VALUE 100 int main(void) { printf(TO_STRING(VALUE)); printf("\n"); return 0; }

运行结果如下

c语言基础运算符(C编程技巧运算符)(5)

解决如下

#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; }

运行结果如下

c语言基础运算符(C编程技巧运算符)(6)

其实解决这个问题,就是加了一个中间转换层,让所有宏的参数在这里全部展开。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页