一:
## 运算符用于在预处理期粘连两个标识符
##的连接作用是在预处理期完成的,因此只在宏定义中有效
编译器不知道 ## 的连接作用
用法:
#define CONNECT(a,b) a##b
in CONNECT(a,1); //int a1;
a1 = 2;
二:
#include <stdio.h>
#define NAME(n) name##n
int main()
{
int NAME(1);
int NAME(2);
NAME(1) = 1;
NAME(2) = 2;
printf("%d\n", NAME(1));
printf("%d\n", NAME(2));
return 0;
}
三:
示例代码如下:
#include <stdio.h>
#define STRUCT(type) typedef struct _tag_##type type;\
struct _tag_##type
STRUCT(Student)
{
int id;
char* name;
};
int main()
{
Student s1;
Student s2;
s1.name = "s1";
s1.id = 0;
s2.name = "s2";
s2.id = 1;
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;
}
通过 gcc -E test.c -o test.i 命令得到如下文件:
typedef struct _tag_Student Student; struct _tag_Student
{
int id;
char* name;
};
int main()
{
Student s1;
Student s2;
s1.name = "s1";
s1.id = 0;
s2.name = "s2";
s2.id = 1;
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;
}
四:
注意: ## 运算符只能在宏定义中有效