能力值:
( LV3,RANK:30 )
|
-
-
2 楼
一般都这样用.很少用宏了.
const int k_x = 100
|
能力值:
( LV3,RANK:30 )
|
-
-
3 楼
不太了解,不过我用的时候能看到,可能装了Visual Assist X 的原因吧
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
选中,右键,转到定义。
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
F12满足你
|
能力值:
( LV3,RANK:20 )
|
-
-
6 楼
楼上正解。。
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
楼主平时都用记事本写代码?
|
能力值:
( 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"))
|
能力值:
( LV4,RANK:50 )
|
-
-
9 楼
装Visual Assist X即可。鼠标指向就显示出来了
|
能力值:
( LV12,RANK:250 )
|
-
-
10 楼
楼主说嵌套宏不就得了。大家以为你是说宏的IDE提示。
貌似VS+VX也的确无法显示正确的值。
是这样的,因为宏只是作为单纯的字符串替换,IDE无法假定这个宏就是一个值,因为它可能是一句代码,一行字符串,甚至多行XXOO。所以没有IDE没有智能到识别一个宏为数值,其实真实原因是:没有必要,这样会拖慢IDE。
宏在某些情况下很方便,但现在的C++已经有很多更优雅的办法替换宏的写法。出现这样的嵌套宏,说明:要不你的代码写的够烂,要不你就是故意写的极端。所有的IDE都没有必要为这样罕见的情况做出处理。
当然,你如果写的是纯C的话。。。纯C本来支持就少,这想法还是早掐了。
如果是单纯的数值宏,建议使用ENUM,在某些情况下,ENUM的提示要好一些。
或者const也可以
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
cout << "fd=" << fd << endl;
|
能力值:
( LV4,RANK:50 )
|
-
-
12 楼
这是我确实没说清楚
现在的项目越来越大,这种定义本身也是存在的,也不能说是谁的问题,因为项目不是一个人写的
所以呢,只寻求解决方法即可,不评论对错了
反正楼上所说的VX是根本不行的,我也在一楼写明了,VX是不行的,但大家好像都没理解……
|
能力值:
( LV4,RANK:50 )
|
-
-
13 楼
这方法就是悲剧……,太麻烦
|
能力值:
( LV4,RANK:50 )
|
-
-
14 楼
这和记事本有啥关系?不理解
|
能力值:
( LV4,RANK:50 )
|
-
-
15 楼
重新描述了问题,你再看看,不是直接定义能解决的
|
能力值:
( LV4,RANK:50 )
|
-
-
16 楼
重新描述了问题,你再看看,不是直接定义能解决的
|
能力值:
( LV4,RANK:50 )
|
-
-
17 楼
呵呵,新写的好办,人家写的还得将就啊,没办法
|
能力值:
( LV4,RANK:50 )
|
-
-
18 楼
重新描述了问题,你再看看,不是直接定义能解决的
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
那我感觉是真无解了...毕竟你编译后这些东西都没有了,要不你就设置个变量传出来吧?
反正我只能想到那么多,有哪位大师有更好的办法还请告知下
|
能力值:
( 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;
}
这是重构的一种方法, 如果合理的重构都不让进行,说明开发流程管理有问题。
这种宏别名的方法只是多定义了宏,替换不好理解的宏。
应该不会引起别人反对吧?
如果是您要维护的工程,你当然有权限改。
如果是为了理解同事的工程,在临时拷贝上进行重构吧.
像变量命名差,宏命名差,随时改掉。 不会影响工程输出质量,而且能提高工程的可读性和可维护性.
|
能力值:
( LV4,RANK:50 )
|
-
-
21 楼
你的做法当然是可以解决问题,但不能每看一个别人的工程,我都上手改一遍,那会很麻烦,而且有些模块是能看不能改,SVN管理,更新等等,所以,我本意只是求个能显示出值的方法来
呵呵,其实大家都是认为VS是不能直接显示的,VA能直接显示宏的定义,但不能显示宏套宏的定义,为了像楼上说的可能是不想浪费CPU?但我觉得VA可以在需要显示宏定义时解析它,技术上应该是可行的,有空可以跟VA提个建议啊 :)
|
能力值:
( LV4,RANK:50 )
|
-
-
22 楼
不是编译后没有的问题
因为宏本身不需要编译都可以知道值,比如
#define x 100
在用的地方点下宏,VA上面的一栏会显示这个宏为多少的
但#define x2 x+1 的话,VA上面显示的是x+1
这时靠VA就不知道x2的值是多少了
其实只需要VA显示宏的时候,进行嵌套解析就行了
|
|
|