OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5663|回复: 17

高手进,C语言 # ## 操作符问题

[复制链接]

18

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2017-6-8
在线时间
35 小时
发表于 2021-3-30 13:44:03 | 显示全部楼层 |阅读模式
5金钱
实例1代码
#include <iostream>
using namespace std;
#define V(x)  var##x
int main()
{   
        int var1=123,var2=222,var3=321;   
        printf("%d\n",V(1));   
        printf("%d\n",V(2));   
        printf("%d\n",V(3));   
        return 0;
}
打印
123
222
321

实例2
#include <iostream>
using namespace std;
#define V(x)  var##x
int main()
{   
        int P=1;   
        int var1=123,var2=222,var3=321;   
        printf("%d\n",V(P));   
        return 0;
}
这段代码没法经过编译,报错为:error: 'varP' was not declared in this scope.
究其原因:凡宏定义里有用’#’或’##’的地方宏参数是不会再展开。但我需要它展开成var1 而不是varP.怎么做?有懂的指点一二

最佳答案

查看完整内容[请看2#楼]

那个只是字符连接,P已经声明为变量了肯定不行的
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2021-3-30 13:44:04 | 显示全部楼层
那个只是字符连接,P已经声明为变量了肯定不行的
回复

使用道具 举报

3

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
434
金钱
434
注册时间
2013-3-18
在线时间
82 小时
发表于 2021-3-30 17:45:17 | 显示全部楼层
#define V(x) var##x
#define _v(x)   V(X)
int p = 1;
_v(p)
回复

使用道具 举报

18

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2017-6-8
在线时间
35 小时
 楼主| 发表于 2021-3-30 20:41:09 | 显示全部楼层
holy404290384 发表于 2021-3-30 17:45
#define V(x) var##x
#define _v(x)   V(X)
int p = 1;

谢谢你的回答,按照你的方法还是报错:error: 'varp' was not declared in this scope.
如果把P定义成宏,就可以了。下面是我改的代码,但是这样的代码不满足我的需求。
#define p 1
#define V(x) var##x
#define _v(x)   V(X)
// int p = 1; 注释掉这行代码
_v(p)
回复

使用道具 举报

18

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2017-6-8
在线时间
35 小时
 楼主| 发表于 2021-3-30 20:43:11 | 显示全部楼层
三叶草 发表于 2021-3-30 18:41
那个只是字符连接,P已经声明为变量了肯定不行的

我也觉得是无解了
回复

使用道具 举报

3

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
434
金钱
434
注册时间
2013-3-18
在线时间
82 小时
发表于 2021-3-31 08:40:46 | 显示全部楼层
三叶草 发表于 2021-3-30 18:41
那个只是字符连接,P已经声明为变量了肯定不行的

哦哦,是的,我搞错了,宏才能先展开
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13104
金钱
13104
注册时间
2012-11-26
在线时间
3811 小时
发表于 2021-3-31 08:42:40 | 显示全部楼层
##是连接符,把前后两个合并起来的作用。一般用在宏定义上
学无止境
回复

使用道具 举报

3

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
434
金钱
434
注册时间
2013-3-18
在线时间
82 小时
发表于 2021-3-31 08:43:00 | 显示全部楼层
hanchaoman 发表于 2021-3-30 20:43
我也觉得是无解了

我也没啥好办法了,宏是预处理的,只能用其他的方法解决你的问题
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2021-3-31 08:53:30 | 显示全部楼层
hanchaoman 发表于 2021-3-30 20:43
我也觉得是无解了

不是无解了,根据你的定义printf("%d\n",V(P));   V(P)实际是varP,varP都没有定义你怎么能输出?你试试V(1)、V(2)、V(3)肯定能输出
回复

使用道具 举报

49

主题

341

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5265
金钱
5265
注册时间
2012-8-25
在线时间
1025 小时
发表于 2021-3-31 10:36:16 | 显示全部楼层
本帖最后由 gotofly21 于 2021-3-31 10:38 编辑

宏是编译阶段就执行了, 只能简单字符替换,你想把变量里的值替换到宏里,那不可能。你想要的效果可能是要指针或者数组,

int  Vann[3];

int p=1;

  printf("%d\n",Vann(p));   





回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3880
金钱
3880
注册时间
2017-3-7
在线时间
1693 小时
发表于 2021-3-31 10:39:25 | 显示全部楼层
编译的第一步就是展开宏,所以展成varP,再编译的时候自然就认为找不到
回复

使用道具 举报

28

主题

294

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1790
金钱
1790
注册时间
2018-3-26
在线时间
294 小时
发表于 2021-3-31 11:42:23 | 显示全部楼层
不能用变量,弄个常量可以
茵茵猪头
回复

使用道具 举报

18

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2017-6-8
在线时间
35 小时
 楼主| 发表于 2021-3-31 12:55:59 | 显示全部楼层
三叶草 发表于 2021-3-31 08:53
不是无解了,根据你的定义printf("%d\n",V(P));   V(P)实际是varP,varP都没有定义你怎么能输出?你试试V ...

是的V(1)、V(2)、V(3)肯定能输出,但是我想要的效果P是变量。
回复

使用道具 举报

18

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2017-6-8
在线时间
35 小时
 楼主| 发表于 2021-3-31 12:56:40 | 显示全部楼层
htao 发表于 2021-3-31 11:42
不能用变量,弄个常量可以

常量可以的,但是我的需求是P是变量。
回复

使用道具 举报

18

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2017-6-8
在线时间
35 小时
 楼主| 发表于 2021-3-31 12:57:36 | 显示全部楼层
a5820736 发表于 2021-3-31 10:39
编译的第一步就是展开宏,所以展成varP,再编译的时候自然就认为找不到

是的,我觉得这个问题无解了
回复

使用道具 举报

18

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2017-6-8
在线时间
35 小时
 楼主| 发表于 2021-3-31 13:05:56 | 显示全部楼层
gotofly21 发表于 2021-3-31 10:36
宏是编译阶段就执行了, 只能简单字符替换,你想把变量里的值替换到宏里,那不可能。你想要的效果可能是要 ...

我想组var1,var2,var3这样的token,这些名字都是之前别人定义过的宏变量,好多varx就是最后1个数字不一致
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2021-4-1 07:24:45 | 显示全部楼层
hanchaoman 发表于 2021-3-31 12:55
是的V(1)、V(2)、V(3)肯定能输出,但是我想要的效果P是变量。

我都说了P已经是变量了,你看看你的宏定义就知道了。这不是有解误解的问题。是你压根就理解的不对。
回复

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1666
金钱
1666
注册时间
2016-4-29
在线时间
266 小时
发表于 2021-4-1 08:41:03 | 显示全部楼层
hanchaoman 发表于 2021-3-31 13:05
我想组var1,var2,var3这样的token,这些名字都是之前别人定义过的宏变量,好多varx就是最后1个数字不一致

定义一个数组,里面按顺序放var1,var2,var3,然后用指针引用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-26 13:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表