关于gcc的扩展宏定义中, "#" 和 "##"的含义
"#" 代表和一个字符串相连接
"##" 代表和一个符号相连接,符号可以是变量,或另一个宏符号
举例如下:
#include<stdio.h>
#define FILE_NAME "/dev/tty"
#define FILE_NAME2 "/dev/console"
// '#' use example
#define FILE_OPEN1(fd,n) \
{ \
fd = open(FILE_NAME#n,O_RDWR); \
if(fd < 0){ \
printf("open tty error\n"); \
return 0; \
} \
}
// '##' use example
#define FILE_OPEN2(fd,n) \
{ \
fd = open(FILE_NAME##n,O_RDWR); \
if(fd < 0){ \
printf("open tty error\n"); \
return 0; \
} \
}
int main(void)
{
FILE_OPEN1(fd1, 1);
FILE_OPEN1(fd2, 2);
FILE_OPEN1(fd3, 3);
FILE_OPEN2(fd4, 1);
FILE_OPEN2(fd5, 2);
FILE_OPEN2(fd6, 3);
return 0;
}
预编译处理:
[email protected]:~/Music$ gcc -E main.c -o main.i
执行后,打开main.i :
底部:
int main(void)
{
{ fd1 = open("/dev/tty""1",O_RDWR); if(fd1 < 0){ printf("open tty error\n"); return 0; } };
{ fd2 = open("/dev/tty""2",O_RDWR); if(fd2 < 0){ printf("open tty error\n"); return 0; } };
{ fd3 = open("/dev/tty""3",O_RDWR); if(fd3 < 0){ printf("open tty error\n"); return 0; } };
{ fd4 = open(FILE_NAME1,O_RDWR); if(fd4 < 0){ printf("open tty error\n"); return 0; } };
{ fd5 = open("/dev/console",O_RDWR); if(fd5 < 0){ printf("open tty error\n"); return 0; } };
{ fd6 = open(FILE_NAME3,O_RDWR); if(fd6 < 0){ printf("open tty error\n"); return 0; } };
return 0;
}
以上,可以看到:
“#”即先展开左右的宏,再以字符串形式拼接起来
“##”即先拼接左右的字符串,再根据拼接起来的结果是不是宏再另行展开
上一篇: 每刷新一次,就有一次写入操作,怎么处理
下一篇: MSQL取不重复数据,新手求教