关于#define的##连接和#连接

xiaonan7627 2009-07-20 09:07:27
我想用一个宏来实现pData->w_i->j
其中i和j是变量,
用#define GetData(a,b) pData->w_###i##->##j
不行,不知道各位有什么方法没?
...全文
128 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
DarkChampion 2009-07-20
  • 打赏
  • 举报
回复
宏是在编译时刻替换的,
要实现楼主的功能可以通过switch穷举来实现

#define GetData(pData,a,b, ret) \
do { \
switch(a) { \
case 1: \
ret = pData->w_1->##b;
break; \
case 2: \
break;\
}while(0);
yshuise 2009-07-20
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 blh 的回复:]
引用 10 楼 yshuise 的回复:
本人已经测试正确了,还说不可能?


你那样直接写数字当然没问题,你把他换成变量i试一下

include "stdafx.h"
#include <iostream>
using std::cout;
using std::endl;

#define GetData(pData,a,b) pData->w_##a##->##b

struct data{
    struct C{
    static    int b;
    }*w_1;
    struct B{
        static    int c;
    }*w_2;
};
int data::C::b = 23;
int data::B::c = 56;

int _tmain(int argc, _TCHAR* argv[])
{
  data mf;
  data* pData = &mf;
  int i = 1;
  cout < <GetData(pData,i,b) < <endl;
  i = 2;
  cout < <GetData(pData,i,c) < <endl;



    return 0;
}
[/Quote]
要理解宏的用法。宏是在编译时刻的替换,不是运行时候的计算。
blh 2009-07-20
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 yshuise 的回复:]
本人已经测试正确了,还说不可能?
[/Quote]

你那样直接写数字当然没问题,你把他换成变量i试一下

include "stdafx.h"
#include <iostream>
using std::cout;
using std::endl;

#define GetData(pData,a,b) pData->w_##a##->##b

struct data{
struct C{
static int b;
}*w_1;
struct B{
static int c;
}*w_2;
};
int data::C::b = 23;
int data::B::c = 56;

int _tmain(int argc, _TCHAR* argv[])
{
data mf;
data* pData = &mf;
int i = 1;
cout<<GetData(pData,i,b)<<endl;
i = 2;
cout<<GetData(pData,i,c)<<endl;




return 0;
}
yshuise 2009-07-20
  • 打赏
  • 举报
回复
本人已经测试正确了,还说不可能?
fuzzy_man 2009-07-20
  • 打赏
  • 举报
回复
##符号在编译器预处理的时候就已经处理,所以你这样写是根本不可能,只能用其他方法,比如switch语句等。

yshuise 2009-07-20
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include <iostream>
using std::cout;
using std::endl;

#define GetData(pData,a,b) pData->w_##a##->##b

struct data{
struct C{
static int b;
}*w_1;
struct B{
static int c;
}*w_2;
};
int data::C::b = 23;
int data::B::c = 56;

int _tmain(int argc, _TCHAR* argv[])
{
data mf;
data* pData = &mf;
cout<<GetData(pData,1,b)<<endl;
cout<<GetData(pData,2,c)<<endl;



return 0;
}


输出结果:
23
56
请按任意键继续. . .
blh 2009-07-20
  • 打赏
  • 举报
回复
一个笨办法
#define GetData(i,j) (((a) == 1) ? pData->w_1->##j : (((a) == 2) ? pData->w_2->##j : ( .... (((a) == 9) ? pData->w_2->##j : pData->w_10->##j))))

其实如果你能把w_i定义成一个数组w[10],那么就简单了
#define GetData(i,j) pData->w[i]->##j
yshuise 2009-07-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xiaonan7627 的回复:]
引用 1 楼 yshuise 的回复:
C/C++ code#define GetData(a,b) pData->w_##a##->##b

GetData(i,j);


a是一个变量,比如说从1到10的数字
这样替换的结果是pData->w_a->b
[/Quote]
先替换值,后连接。

xuegao007 2009-07-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xiaonan7627 的回复:]
引用 1 楼 yshuise 的回复:
C/C++ code#define GetData(a,b) pData->w_##a##->##b

GetData(i,j);


a是一个变量,比如说从1到10的数字
这样替换的结果是pData->w_a->b
[/Quote]
以上说法是不正确的. 这种情况用宏实现不了的.
hoomey 2009-07-20
  • 打赏
  • 举报
回复
这个估计不好弄吧
是要把字符串转换成变量的,有难度
taodm 2009-07-20
  • 打赏
  • 举报
回复
兄弟,就用用函数吧。不要玩这个宏技巧。
xiaonan7627 2009-07-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yshuise 的回复:]
C/C++ code#define GetData(a,b) pData->w_##a##->##b

GetData(i,j);
[/Quote]

a是一个变量,比如说从1到10的数字
这样替换的结果是pData->w_a->b
yshuise 2009-07-20
  • 打赏
  • 举报
回复
#define GetData(a,b) pData->w_##a##->##b

GetData(i,j);

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧