C/C++ define宏定义中特殊操作符的用法

创建时间:2022/4/21 16:22
更新时间:2022/4/21 18:21
作者:gi51wa2j
标签:bingo, C, 细节知识

1. (#)字符串化操作符

1.1 作用

将宏定义中的传入参数转化为用一对双括号括起来的字符串,该过程称之为字符串化,其只能用于有传入参数的宏定义中。

1.2 example

1.2.1 example1

  • code1
#include <stdio.h> #define ChangeCharacter(str) printf("测试输出:\n%s\n",str) int main() {        ChangeCharacter("Test character");        return 0; }
  • output1

1.2.2 example2

  • code2
#include <stdio.h> #define ChangeCharacter(x) printf(#x" = %d\n",(x)) int main() {        ChangeCharacter(6);        ChangeCharacter(6+6);        return 0; }
  • output1

2.(##)粘贴操作符

2.1 作用

合并宏定义中的两个标识符,使其成为一个独立的标识符。
相关博客

2.2 example

#include <stdio.h> #define ChangeCharacter(x) num##x int main() {        int num6 = 65;        int num = ChangeCharacter(6);        printf("%d", num);                return 0; }

2.3 注意

#define ChangeCharacter(x) num ## x
等同于
#define ChangeCharacter(x) num##x
#include <stdio.h> #define STRCPY(a, b) strcpy(a ## _p, #b) int main() {        char var1_p[20];        char var2_p[30];        strcpy(var1_p, "aaaa");        strcpy(var2_p, "bbbb");        STRCPY(var1, var2);        STRCPY(var2, var1);        printf("var1 = %s\n", var1_p);        printf("var2 = %s\n", var2_p);        //STRCPY(STRCPY(var1,var2),var2);        //这里是否会展开为: strcpy(strcpy(var1_p,"var2")_p,"var2“)?答案是否定的:        //展开结果将是:     strcpy(STRCPY(var1,var2)_p,"var2")        //## 阻止了参数的宏展开!如果宏定义里没有用到 # 和 ##, 宏将会完全展开        // 把注释打开的话,会报错:implicit declaration of function 'STRCPY'        return 0; }

3. (__VA_AGRRS__)可变参数宏

3.1 作用

__VA_ARGS__ 是一个可变参数宏,与省略号 ... 配合使用,用来替换省略号所代表的字符串。
参考链接

3.2 example

#include <stdio.h> #define ExampleOutut(...) printf(__VA_ARGS__) int main() {        int num6 = 65;        ExampleOutut("Number is %d\n", num6);                return 0; }