上海网站建设公司排行,青海最新消息今天,wordpress注册界面修改密码,安徽建站系统关于gcc扩展中的宏定义中用 # 和 ##今天测试了宏定义中的 # 和 ## 的区别。
结果如下#xff1a;
# 代表和一个字符串相连接
## 代表和一个符号连接#xff0c;符号可以是变量#xff0c;或另一…关于gcc扩展中的宏定义中用 # 和 ##今天测试了宏定义中的 # 和 ## 的区别。
结果如下
# 代表和一个字符串相连接
## 代表和一个符号连接符号可以是变量或另一个宏符号。
举例如下
宏定义如下
(1)
#define DEV_FILE_NAME /dev/test_kft
#define OPEN_FILE(fd, n) / { / fd open(DEV_FILE_NAME #n,O_RDONLY); / if(fd 0) / { / printf(Open device error/n); / return 0; / } / }
如此调用 OPEN_FILE(fd1, 1); OPEN_FILE(fd2, 2); OPEN_FILE(fd3, 3); OPEN_FILE(fd4, 4); OPEN_FILE(fd5, 5); OPEN_FILE(fd6, 6);
用gcc -E展开后如下
2299: { fd1 open(/dev/test_kft 1,00); if(fd1 0) { printf(Open device error/n); return 0; } }; 2300: { fd2 open(/dev/test_kft 2,00); if(fd2 0) { printf(Open device error/n); return 0; } }; 2301: { fd3 open(/dev/test_kft 3,00); if(fd3 0) { printf(Open device error/n); return 0; } }; 2302: { fd4 open(/dev/test_kft 4,00); if(fd4 0) { printf(Open device error/n); return 0; } }; 2303: { fd5 open(/dev/test_kft 5,00); if(fd5 0) { printf(Open device error/n); return 0; } }; 2304: { fd6 open(/dev/test_kft 6,00); if(fd6 0) { printf(Open device error/n); return 0; } };
如果没有定义DEV_FILE_NAME 就是
2299: { fd1 open(DEV_FILE_NAME 1,00); if(fd1 0) { printf(Open device error/n); return 0; } }; 2300: { fd2 open(DEV_FILE_NAME 2,00); if(fd2 0) { printf(Open device error/n); return 0; } }; 2301: { fd3 open(DEV_FILE_NAME 3,00); if(fd3 0) { printf(Open device error/n); return 0; } }; 2302: { fd4 open(DEV_FILE_NAME 4,00); if(fd4 0) { printf(Open device error/n); return 0; } }; 2303: { fd5 open(DEV_FILE_NAME 5,00); if(fd5 0) { printf(Open device error/n); return 0; } }; 2304: { fd6 open(DEV_FILE_NAME 6,00); if(fd6 0) { printf(Open device error/n); return 0; } };
所以可以很清楚的看出#n 解析出来的是n , 用于连接一个已有的字符串。
(2) 再来看 ## 是什么意思, 宏定义如下
#define OPEN_FILE(fd, n) / { / fd open(DEV_FILE_NAME ##n,O_RDONLY); / if(fd 0) / { / printf(Open device error/n); / return 0; / } / }
调用方式相同。
看宏展开
2299: { fd1 open(DEV_FILE_NAME1,00); if(fd1 0) { printf(Open device error/n); return 0; } }; 2300: { fd2 open(DEV_FILE_NAME2,00); if(fd2 0) { printf(Open device error/n); return 0; } }; 2301: { fd3 open(DEV_FILE_NAME3,00); if(fd3 0) { printf(Open device error/n); return 0; } }; 2302: { fd4 open(DEV_FILE_NAME4,00); if(fd4 0) { printf(Open device error/n); return 0; } }; 2303: { fd5 open(DEV_FILE_NAME5,00); if(fd5 0) { printf(Open device error/n); return 0; } }; 2304: { fd6 open(DEV_FILE_NAME6,00); if(fd6 0) { printf(Open device error/n); return 0; } };
现在看清楚了, ##n 的作用是把n直接连接在了一个符号的末尾. 好 现在我们定义一个符号看看效果。
#define DEV_FILE_NAME1 /dev/test_kft1
再展开 2299: { fd1 open(/dev/test_kft1,00); if(fd1 0) { printf(Open device error/n); return 0; } }; 2300: { fd2 open(DEV_FILE_NAME2,00); if(fd2 0) { printf(Open device error/n); return 0; } }; 2301: { fd3 open(DEV_FILE_NAME3,00); if(fd3 0) { printf(Open device error/n); return 0; } }; 2302: { fd4 open(DEV_FILE_NAME4,00); if(fd4 0) { printf(Open device error/n); return 0; } }; 2303: { fd5 open(DEV_FILE_NAME5,00); if(fd5 0) { printf(Open device error/n); return 0; } }; 2304: { fd6 open(DEV_FILE_NAME6,00); if(fd6 0) { printf(Open device error/n); return 0; } };
很显然第一个符号被替换了, 因为是符号是宏的缘故。 这样我们也能把这一扩展特性应用在变量上。