#运算符
(1)#运算符用于在预处理期将宏参数转换为字符串
(2)#的转换作用是在预处理器完成的,因此只在宏定义中有效
(3)编译器不知道#的转换作用
用法:
#define SIRING(x) #x
printf("%s\n",SIRING(Hello World!));
项目中的用法:
#include <stdio.h>
#define CALL(f, p) (printf("Call funcyion %s\n",#f, f(p)))
int square(int n)
{
return n*n;
}
int func(int x)
{
return x;
}
int main()
{
int result = 0;
result = CALL(square, 4);
printf("result = %d\n",result);
result = CALL(func, 4);
printf("result = %d\n",result);
return 0;
}
##运算符
(1)##运算符用于在预处理期粘连两个标识符
(2)##的连接作用是在预处理器完成的,因此只在宏定义中有效
(3)编译器不知道##的连接作用
用法:
#define CONNECT(a,b) a##b
int CONNECT(a,1); //int a1;
a1 = 2;
#include <stdio.h>
#define NAME(n) name##n
int main()
{
int NAME(1);
int NAME(2);
name1 = 1;
NAME(2) = 2;
printf("%d %d\n",name1, NAME(2));
return 0;
}
结构体用法工程解决方案:
#include <stdio.h>
/*typedef struct _tag_Student Student;
struct _tag_Student
{
int id;
char *name;
};*/
#define STRUCT(type) typedef struct _tag_##type type;struct _tag_##type
STRUCT(Student)
{
int id;
char *name;
};
int main()
{
Student s1;
s1.id = 1;
s1.name = "Xiaoming";
return 0;
}