1:#操作符用于预处理阶段,将宏参数转换为字符串,只有宏定义中使用(#define)
使用方法:
#define STRING(x) #x
printf("%s\n",STRING(Hello World!));
1:##操作符用于预处理阶段,将粘连两个标识符,只有宏定义中使用(#define)
使用方法:
#define CONNECT(a,b) a##b
int CONNECT(a,1); //int a1
a1 = 2;
想一个问题啊,怎样打印任意函数名出来?
- #include <stdio.h>
- #define STRING(x) #x
- //下面这个宏就是实现打印认识函数名称方法
- #define CALL(f,p) (printf("Call function %s\n",#f),f(p))
- int square(int n)
- {
- return n*n;
- }
- int func(int n)
- {
- return n;
- }
- #define NAME(n) name##n
- //传统方式:
- //typedef struct _tag_Student Student;
- //struct _tag_Student
- //{
- // char* name;
- // int id;
- //};
- //用宏定义方式
- #define STRUCT(type) typedef struct _tag_##type type;\
- struct _tag_##type
- STRUCT(Student)
- {
- char* name;
- int id;
- };
- int main()
- {
- int result = 0;
- int NAME(1); //定义name1
- int NAME(2); //定义name2
- Student s1;
- Student s2;
- //************演示#运算符使用方法*************//
- printf("%s\n",STRING(Hello World));
- printf("%s\n",STRING(100));
- printf("%s\n",STRING(while));
- printf("%s\n\n",STRING(return));
- //************演示#打印任意函数名称方法********//
- result = CALL(square,4);
- printf("result = %d\n",result);
- result = CALL(func,10);
- printf("result = %d\n\n",result);
- //************演示##运算符使用方法************//
- NAME(1) = 1; //name1 = 1
- NAME(2) = 2; //name2 = 2
- printf("%d\n",NAME(1)); //打印name1 = 1
- printf("%d\n",NAME(2)); //打印name2 = 2
- //************演示##定义结构体特殊用法*********//
- s1.name = "Lilei";
- s1.id = 0;
- printf("s1.name = %s s1.id = %d\n",s1.name,s1.id);
- s2.name = "Hanmeimei";
- s2.id = 1;
- printf("s2.name = %s s2.id = %d\n",s2.name,s2.id);
- return 0;
- }
程序比较简单,都有注释
参考资料《狄泰软件C语言进阶》
联系客服