第25课 #和##操做符使用分析

·#运算符用于预处理器期将宏参数转换为字符串
·#的转换做用是在预处理器完成的,所以只在宏定义中有效
·编译器不知道#的转换做用
·用法:code

define STRING(x) #x

printf("%sn",STRING(HELLO World!)); 字符串

例子25-1:编译器

include "stdio.h"

define STRING(x) #x

int main()
{io

printf("%s\n",STRING(Hello world!));
printf("%s\n",STRING(100));
printf("%s\n",STRING(While));
printf("%s\n",STRING(return));
return 0;

}
输出结果:
Hello world!
100
While
return编译

例子25-2:function

include "stdio.h"

define CALL(f,p) (printf("Call function %sn",#f),f(p))

int square(int n)
{di

return n * n;

}
int func(int x)
{co

return x;

}
int main()
{字符

int result = 0;
result = CALL(square, 4); 
//result = (printf("Call funtion %s\n","square"),square(4));
printf("result = %d\n",result);
result = CALL(square, 10);
printf("result = %d\n",result);

}
输出结果:
Call function square
result = 16
Call function square
result = 100运算符

运算符

·##运算符用于预处理器粘连两我的标识符
·##的链接做用是在预处理器期完成的,所以只在宏定义中有效
·编译器不知道##的链接做用
·用法

define CONNECT(a,b) a##b

int CONNECT(a,1); //int a1;
a1 = 2;

例子25-3:

include "stdio.h"

define NAME(n) name##n

int main()
{

int NAME(1);
int NAME(2);
 NAME(1) = 1;  //name1 = 1;
 NAME(2) = 2;  //name2 = 2;
 printf("%d\n",NAME(1));
 printf("%d\n",NAME(2));

}
输出结果:
1
2

例子25-4:

include"stdio.h"

define STRUCT(type) typedef struct _tag_##type type;struct _tag_##type

STRUCT (Student)
{

char *name;
int id;

}
int main()

{

Student s1;
Student s2;
s1.id = 0;
s1.name = "S1";
s2.id = 1;
s2.name = "S2";
printf("s1.name = %s\n",s1.name);
printf("s1.id = %d\n",s1.id);
printf("s1.name = %s\n",s1.name);
printf("s1.id = %d\n",s1.id);
return 0;

}
小结:

运算符用于预处理器将宏参数转换为字符串

运算符用于预处理器粘连两个标识符

编译器不知道#和##运算符的存在

与##运算符只在红定义中有效

相关文章
相关标签/搜索