首页 > 代码库 > C语言学习笔记--#和##操作符
C语言学习笔记--#和##操作符
1. #运算符
(1)#运算符用于在预处理期将宏的参数转换为字符串
(2)#的转换作用是在预处理期完成的,因此只在宏定义中有效,即其他地方不能用#运算符
(3)用法:#define STRING(x) #x
printf("%s\n",STRING(Hello World!));//注意,Hello World!不加引号!
#include <stdio.h>#define STRING(x) #xint main(){ //注意宏参数不用加引号,#运算符在宏替换时会自动加上去 printf("%s\n",STRING(Hello World!)); //"Hello World!" printf("%s\n",STRING(100)); //"100" printf("%s\n",STRING(while)); //"while" printf("%s\n",STRING(return)); //"return" return 0;}
#运算符的妙用
#include <stdio.h>//注意宏后面的为逗号表达式,返回的是第 1 个表达式的值//该宏最大的用处在于,可以输出被调用的函数的名称#define CALL(f,p) (printf("Call function %s\n",#f),f(p))int square(int n){ return n*n;}int func(int x){ return x;}int main(){ int iRet = 0; //将函数名称作用宏参数,利用#运算符将这个名称转为字符串输出 //同时,逗号表达式最后一个式子调用相应的函数 iRet = CALL(square,4); printf("result = %d\n",iRet);//输出函数名,并调用函数 iRet = CALL(func,10); printf("result = %d\n",iRet);//输出函数名,并调用函数 return 0;}
2. ##运算符
(1)##运算符用于在预处理期粘连两个标识符
(2)##的连接作用是在预处理期完成的,因此只在宏定义中有效。
(3)编译器不知道##的连接作用
(4)用法:
#define CONNECT(a,b) a##b
int CONNECT(a,1); //int a1;
a1 = 2;
#include <stdio.h>#define NAME(n) name##nint main(){ int NAME(1); //name1; int NAME(2); //name2; NAME(1) = 1; //name1 = 1; NAME(2) = 2; //name2 = 2; printf("%d\n",NAME(1)); printf("%d\n",NAME(2)); return 0;}
##运算符的工程应用
#include <stdio.h>//该宏可以方便定义结构体,并给结构体命名。//省去每次在定义结构体时,都要重复地写上//typedef struct ....之类的相同代码#define STRUCT(type) \typedef struct _tag_##type type;struct _tag_##type//定义结构体,并命名为 StudentSTRUCT(Student){ char* name;int id;};int main(){ Student s1; Student s2; s1.name = "s1"; s1.id = 1; s2.name = "s2"; s2.id = 2; printf("s1.name = %s\n",s1.name); printf("s1.id = %d\n",s1.id); printf("s2.name = %s\n",s2.name); printf("s2.id = %d\n",s2.id); return 0;}
C语言学习笔记--#和##操作符
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。