首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

请问宏连接符的用法

2013-08-26 
请教宏连接符的用法#int var1int var2#define V1 1#define V2 2#define VAR_X(x)var##x我知道上面这种做

请教宏连接符的用法
#


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;
//}
//


[解决办法]
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:


#include <string>
#include <iostream>

int var1 = 1;
int var2 = 3;


#define VAR_X(x)   var##x
#define V1 VAR_X(1)
#define V2 VAR_X(2)

int main()
{
printf("%d, %d", V1, V2);
return 0;
}

这不是我想要的,我想要的是一种将一些本该数组定义的变量,如VAR1,VAR2,VAR3等变成VALUE(1),VALUE(2)这种方式来访问,拿您的代码来说,

#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, %d", VAR_X(V1),VAR_X(V2));
return 0;
}
这样就是不成功的,这是为什么呢?逻辑上与您的代码有什么区别吗


关于宏替换,总共有两次扫描. 
首先讲我的方式:



#define VAR_X(x)   var##x
#define V1 VAR_X(1)
#define V2 VAR_X(2)
 printf("%d, %d", V1, V2);


//第一次扫描后
printf("%d, %d", VAR_X(1), VAR_X(2));
//第二次扫描后
printf("%d, %d", var1, var2);



而你的方式不需要第二次扫描

#define V1 1
#define V2 2
#define VAR_X(x)   var##x
printf("%d, %d", VAR_X(V1),VAR_X(V2));
//第一次扫描
printf("%d, %d",varV1,varV2));
//因为varV1和varV2都是宏,所以不需要第二次扫描了


具体你可看看c++ 标准[16 Preprocessing directives]

那您知道为什么V1没有被解释成1吗?我的代码编译时给的错误信息是将VAR_X(V1)解释成了varV1,我想知道为什么没有解释成var1呢?标准我有时间一定会看,谢谢

每一次扫描只做一次替换: 先看见宏VAR_X(V1),所以先展开VAR_X而不是V1

热点排行