Chinaunix首页 | 论坛 | 博客
  • 博客访问: 313015
  • 博文数量: 174
  • 博客积分: 3061
  • 博客等级: 中校
  • 技术积分: 1740
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-04 22:43
文章分类

全部博文(174)

文章存档

2011年(54)

2010年(14)

2009年(30)

2008年(26)

2007年(27)

2006年(23)

我的朋友

分类: WINDOWS

2011-09-28 13:49:36

转载自同事email

 

赚分享分了~今天来看下 VS 的另一个扩展的玩意儿。

 

(首发地址:http://www.cppblog.com/Streamlet/archive/2011/02/27/140742.aspx

 

不知大家有没有发现,当使用 VS 来调试代码的时候,那些 STL 容器的信息会以比较看得懂的方式显示出来:

说明: 说明: http://www.cppblog.com/images/cppblog_com/Streamlet/Windows-Live-Writer/f42585ce8478_E196/image_2.png

而我们自己写的,它只能按照数据成员来显示,如果数据结构稍微复杂点,看这些直接显示的内容得到的有用信息就会很少了:

说明: http://www.cppblog.com/images/cppblog_com/Streamlet/Windows-Live-Writer/f42585ce8478_E196/image_4.png

那么,是否有办法能让 IDE 按照我们设想的方式来显示数据呢?答案是肯定的。这个配置就位于autoexp.txt 中(具体路径为 X:\Program Files\Microsoft Visual Studio 10.0\Common7\Packages\Debugger\autoexp.dat,如果是 VS 不同版本,“Microsoft Visual Studio 10.0”中的版本号换成其他的即可,VS 2005 以上版本都支持)。

 

在里面搜索 vector,可以找到作用于 vector 的调试信息显示方式的语句:

 

std::vector<*>{

    preview (

        #(

            "[",

            $e._Mylast - $e._Myfirst,

            "](",

            #array(

                expr: $e._Myfirst[$i],

                size: $e._Mylast - $e._Myfirst

            ),

            ")"

        )

    )

 

    children (

        #(

            #([size] : $e._Mylast - $e._Myfirst),

            #([capacity] : $e._Myend - $e._Myfirst),

            #array(

                expr: $e._Myfirst[$i],

                size: $e._Mylast - $e._Myfirst

            )

        )

    )

}

 

这个语法的详细官方说明好像没有,不过大体上可以猜出来。

 

第一行 std::vector<*> 是类型,说明下面的内容针对 std::vector,并且适用于任意模版参数。紧接着是一个大括号括起来的段落。

 

preview 开始的那一段表示当该变量单行显示的时候该如何显示,也就是下图第二列的样子:

说明: image

IDE 会依次显示 preview(#(  )) 括号内的以逗号分隔的内容,加引号的会原样显示,变量用 $e引用(将 $e 视为该类型的一个变量)。

 

除了直接引号,变量的运算结果外,这里还可以写一些高级点的玩意儿,如 #array#list#tree

 

#array 的格式为:

#array(

    expr: … ,

    size:  …

)

其中 expr 里可以使用 $i$i 为元素 indexsize 表示元素个数。最终的结果为:

$i=0时的expr, $i=1时的expr, , $i=size时的expr

 

假设有一个结构:

struct Vector

{

    int *pData;

    int nCount;

};

其中 p 是指向一块 count  int 的内存。如果要依次显示这 count 个数字,preview 中应该写:

preview (

    #(

        #array(

            expr: $e.pData[$i],

            size: $e.nCount

        )

    )

)

 

#list 的格式为:

#list(

    head: … ,

    size: … ,

    next: …

) : …

其中 head 是指向第一个 Node 的指针,size 表示元素个数,next 表示 Node 中指向下一个 Node的分量名,最后冒号后面还要写一个 Node 中的值分量,也就是要显示的那个变量。

 

假设有结构:

struct ListNode

{

    int nData;

    ListNode *pNext;

};

struct List

{

    ListNode *pHead

    int nCount;

};

preview 的写法为:

preview (

    #(

        #list(

            head: $e.pHead,

            size: $e.nCount,

            next: pNext

        ) : $e.nData    // 注意,这里的 $e 代表 ListNode,上面两个 $e 都代表 List

    )

)

 

#tree的格式为

#tree(

    head: …,

    left: …,

    right: …,

    size: …

) : …

其中 head 是指向根节点的指针,left  right 分别是指向左右子树的分量名,size 表示元素个数,最后冒号后面写节点中的值分量。IDE会对整棵树做中序遍历。

 

假设有结构:

struct TreeNode

{

    int nData;

    TreeNode *pLeft;

    TreeNode *pRight;

};

struct Tree

{

    TreeNode *pRoot;

    int nCount;

};

preview 的写法为:

preview (

    #(

    #tree(

        head: $e.pRoot,

        left: pLeft,

        right: Right,

        size: $e.nCount

        ) : $e.nData // 注意,这里的 $e 代表 TreeNode,上面两个 $e 都代表 Tree

    )

)

 

 

preview 的格式就到此。接下来是 children,它用于描述点击变量左边的加号后,展开的内容怎么显示,如图:

说明: image

IDE 会依次显示 children(#(  )) 括号内的以逗号分隔的内容,每个显示为一行。刚才的 #array, #list, #tree 都可以用,会显示成第一列索引第二列值的样子。

另外可以用 #(first, second) 的格式,first 会原样显示在第一列,second 会求值显示在第二列。

 

 

了解以上这些内容,我们已经可以针对 STL 的那些数据结构做自定义显示了,对一些别的数据结构作简单的自定义显示也不难。

 

 

 

最后给个效果图,定义了我自己的那些容器的显示方式。怎么样,看上去一定比开头给出的那个冷冰冰的样子好很多吧?

说明: image

 

阅读(668) | 评论(0) | 转发(0) |
0

上一篇:scrum编程读后感

下一篇:器官和食物

给主人留下些什么吧!~~