首页
社区
课程
招聘
[讨论]老问题:VS中定义的宏,如何查看它的值?无解?
发表于: 2013-8-26 18:20 12952

[讨论]老问题:VS中定义的宏,如何查看它的值?无解?

2013-8-26 18:20
12952
刚google一下,也有人讨论这问题,但基本上都无人解决,看这能突破不?

我想大家在用宏时也有这个需求吧:
定义宏后,在代码中,想知道这个宏的值,vs根本不会显示出来,调试时也不会显示,va同样也不会显示
情况如下:
#define x1 100
#define x2 x1+1
#define x3 x2+1
#define x4 x3+1
#define x5 x4+1
#define x6 x5+1
#define xx x6+1

经过几十行后,根本没人知道xx这个宏是啥值,不能每次都去数一数吧?但这对于编译器来说确又很容易确定的,这对软件开发者来说很麻烦啊

有没有办法能看到呢?要是vs开发者想处理,应该很容易的事啊。。。

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (21)
雪    币: 183
活跃值: (1058)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
一般都这样用.很少用宏了.
const int k_x = 100
2013-8-26 18:23
0
雪    币: 6499
活跃值: (3117)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
不太了解,不过我用的时候能看到,可能装了Visual Assist X 的原因吧
2013-8-26 18:27
0
雪    币: 652
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
选中,右键,转到定义。
2013-8-26 21:20
0
雪    币: 113
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
F12满足你
2013-8-26 22:58
0
雪    币: 166
活跃值: (42)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
楼上正解。。
2013-8-26 23:02
0
雪    币: 1042
活跃值: (470)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
楼主平时都用记事本写代码?
2013-8-26 23:21
0
雪    币: 236
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
#define MACRO_TOSTRING_HELPER(x)    #x
#define TRAN_MACRO_TOSTRING(mac)    MACRO_TOSTRING_HELPER(mac)

#define UNICODE
printf(TRAN_MACRO_TOSTRING(_T("abc"))
2013-8-26 23:34
0
雪    币: 220
活跃值: (117)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
装Visual Assist X即可。鼠标指向就显示出来了
2013-8-26 23:44
0
雪    币: 517
活跃值: (84)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
10
楼主说嵌套宏不就得了。大家以为你是说宏的IDE提示。
貌似VS+VX也的确无法显示正确的值。
是这样的,因为宏只是作为单纯的字符串替换,IDE无法假定这个宏就是一个值,因为它可能是一句代码,一行字符串,甚至多行XXOO。所以没有IDE没有智能到识别一个宏为数值,其实真实原因是:没有必要,这样会拖慢IDE。
宏在某些情况下很方便,但现在的C++已经有很多更优雅的办法替换宏的写法。出现这样的嵌套宏,说明:要不你的代码写的够烂,要不你就是故意写的极端。所有的IDE都没有必要为这样罕见的情况做出处理。
当然,你如果写的是纯C的话。。。纯C本来支持就少,这想法还是早掐了。
如果是单纯的数值宏,建议使用ENUM,在某些情况下,ENUM的提示要好一些。
或者const也可以
2013-8-27 09:32
0
雪    币: 9
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
cout << "fd=" << fd << endl;
2013-8-27 09:33
0
雪    币: 174
活跃值: (620)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
这是我确实没说清楚
现在的项目越来越大,这种定义本身也是存在的,也不能说是谁的问题,因为项目不是一个人写的
所以呢,只寻求解决方法即可,不评论对错了

反正楼上所说的VX是根本不行的,我也在一楼写明了,VX是不行的,但大家好像都没理解……
2013-8-27 15:23
0
雪    币: 174
活跃值: (620)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
这方法就是悲剧……,太麻烦
2013-8-27 15:24
0
雪    币: 174
活跃值: (620)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
这和记事本有啥关系?不理解
2013-8-27 15:27
0
雪    币: 174
活跃值: (620)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
重新描述了问题,你再看看,不是直接定义能解决的
2013-8-27 15:28
0
雪    币: 174
活跃值: (620)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
重新描述了问题,你再看看,不是直接定义能解决的
2013-8-27 15:29
0
雪    币: 174
活跃值: (620)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
17
呵呵,新写的好办,人家写的还得将就啊,没办法
2013-8-27 16:22
0
雪    币: 174
活跃值: (620)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
18
重新描述了问题,你再看看,不是直接定义能解决的
2013-8-27 16:24
0
雪    币: 113
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
那我感觉是真无解了...毕竟你编译后这些东西都没有了,要不你就设置个变量传出来吧?
反正我只能想到那么多,有哪位大师有更好的办法还请告知下
2013-8-27 19:58
0
雪    币: 112
活跃值: (57)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
20
宏无法用IDE直接展开查看吧?
换一种思路是否可以?
// testMacro.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include <tchar.h>
#include <string>

/// 不好理解的宏
#define x1 100
#define x2 x1+1
#define x3 x2+1
#define x4 x3+1
#define x5 x4+1
#define x6 x5+1
#define xx x6+1

/// 重新定义一些宏, 将自己用到的地方换成重新定义的宏,看到就能理解该宏的含义

/// sunbinjin@pediy 的条件宏, 睡眠时间 = 106MS ~
#define SUNBINJIN_SLEEP_TIME_106_MS xx

int _tmain(int argc, _TCHAR* argv[])
{
    /// 使用宏的地方, 原来是xx, 现在为了好理解,换成贴切的宏别名
    /// 只替换自己用的地方,免得被同事说
    /// 如果有权限批量替换工程中的xx为有意义的宏别名,那就太好了

    /// 当用到宏的时候,我们能从宏的别名, 直接弄清宏的具体含义和值
    /// 不需要转到宏的定义出去看
    ::Sleep(SUNBINJIN_SLEEP_TIME_106_MS);
    _tprintf(L"sleep for a rest\r\n");

_tmain_END:
    _tprintf(L"\r\nEND, press anykey to quit\r\n");

    /** run results
    sleep for a rest

    END, press anykey to quit
    */
    getwchar();
    return 0;
}


这是重构的一种方法, 如果合理的重构都不让进行,说明开发流程管理有问题。
这种宏别名的方法只是多定义了宏,替换不好理解的宏。
应该不会引起别人反对吧?

如果是您要维护的工程,你当然有权限改。
如果是为了理解同事的工程,在临时拷贝上进行重构吧.

像变量命名差,宏命名差,随时改掉。 不会影响工程输出质量,而且能提高工程的可读性和可维护性.
2013-8-27 20:31
0
雪    币: 174
活跃值: (620)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
21
你的做法当然是可以解决问题,但不能每看一个别人的工程,我都上手改一遍,那会很麻烦,而且有些模块是能看不能改,SVN管理,更新等等,所以,我本意只是求个能显示出值的方法来

呵呵,其实大家都是认为VS是不能直接显示的,VA能直接显示宏的定义,但不能显示宏套宏的定义,为了像楼上说的可能是不想浪费CPU?但我觉得VA可以在需要显示宏定义时解析它,技术上应该是可行的,有空可以跟VA提个建议啊 :)
2013-8-28 10:07
0
雪    币: 174
活跃值: (620)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
22
不是编译后没有的问题
因为宏本身不需要编译都可以知道值,比如
#define x 100
在用的地方点下宏,VA上面的一栏会显示这个宏为多少的
但#define x2 x+1 的话,VA上面显示的是x+1
这时靠VA就不知道x2的值是多少了
其实只需要VA显示宏的时候,进行嵌套解析就行了
2013-8-28 10:10
0
游客
登录 | 注册 方可回帖
返回
//