请教宏连接符的用法
#
int var1;
int var2;
#define V1 1
#define V2 2
#define VAR_X(x) var##x
我知道上面这种做法不对,但是我应该怎么写这个宏才能实现VAR_X(V1)->var1这种效果呢???或者说到底能不能实现呢。看过赵老师之前回复一篇帖子,但是还是没搞懂怎么实现。。。http://bbs.csdn.net/topics/390298106 宏 连接符
[解决办法]
试试:
#include <string>
#include <iostream>
int var1 = 1;
int var2 = 3;
#define V1 1
#define V2 2
#define VAR_X(x) var##x
int main()
{
printf("%d\n", VAR_X(V1));
printf("%d\n", VAR_X(V2));
return 0;
}
复杂宏技术不如代码生成技术。
代码生成技术参考:
//codegen.c
// 输入一组字符串,比如
// aa ss ddd dd 33 dd
// 然后自动生成一个函数 int A(const char*);
// 实现A("aa")返回0 A("ss")返回1 依次类推
#include <stdio.h>
int main(int argc,char **argv) {
int i;
if (argc<2) {
printf("%s p1 [p2 ...] [>result.c]\nGenerate code int A(const char *a); 0==A(\"p1\") 1==A(\"p2\") ...",argv[0]);
return 1;
}
//printf("#include <string.h>\n");
printf("int A(const char *a) {\n");
for (i=0;i<argc-1;i++) {
printf(" if (0==strcmp(a,\"%s\")) return %d;\n",argv[i+1],i);
}
printf(" return -1;\n");
printf("}\n");
return 0;
}
//C:\test\Debug>codegen.exe
//codegen.exe p1 [p2 ...] [>result.c]
//Generate code int A(const char *a); 0==A("p1") 1==A("p2") ...
//C:\test\Debug>codegen.exe aa ss ddd dd 33 dd
//int A(const char *a) {
// if (0==strcmp(a,"aa")) return 0;
// if (0==strcmp(a,"ss")) return 1;
// if (0==strcmp(a,"ddd")) return 2;
// if (0==strcmp(a,"dd")) return 3;
// if (0==strcmp(a,"33")) return 4;
// if (0==strcmp(a,"dd")) return 5;
// return -1;
//}
//
//c:\test\Debug>codegen.exe aa ss ddd dd 33 dd >result.c
//
//c:\test\Debug>type result.c
//int A(const char *a) {
// if (0==strcmp(a,"aa")) return 0;
// if (0==strcmp(a,"ss")) return 1;
// if (0==strcmp(a,"ddd")) return 2;
// if (0==strcmp(a,"dd")) return 3;
// if (0==strcmp(a,"33")) return 4;
// if (0==strcmp(a,"dd")) return 5;
// return -1;
//}
//
[解决办法]
每一次扫描只做一次替换: 先看见宏VAR_X(V1),所以先展开VAR_X而不是V1