linux 强制类型转换,[z]C++结构类型在GDB中的强制类型转换

今天在调试程序的过程中遇到的一个小问题,在这里记录一下,希望能对遇到同样问题的朋友有所帮助。

以下面的程序为例程进行说明:

class Base

{

public:

Base(int nNum) :

m_nNum(nNum)

{}

private:

int m_nNum;

};

class A : public Base

{

public:

A(int nNum, char bCh) :

Base(nNum),

m_bCh(bCh)

{}

private:

char m_bCh;

};

namespace Test

{

class Base

{

public:

Base(int nNum) :

m_nNum(nNum)

{}

private:

int m_nNum;

};

class A : public Base

{

public:

A(int nNum, char bCh) :

Base(nNum),

m_bCh(bCh)

{}

private:

char m_bCh;

};

}

int main()

{

Base * pObj1 = new A(10, 'A');

Test::Base * pObj2 = new Test::A(10, 'A');

delete pObj1;

delete pObj2;

}

相信只要有点C++基础的人都能够看懂上面的程序,如果看不懂的话,还是先回去学C++吧,嘿嘿!好了,言规正传,现在抛出问题:用gdb启动编译好的程序,在63行处设置断点,如何查看pObj1和pObj2的m_bCh的值?

1. 第一次尝试,直接p *pObj1,结果如下所示:

(gdb) p *pObj1

$1 = {

m_nNum = 10

}

2. 由第一次尝试的结果,想到了强制类型转型,转换为子类A的指针类型,然后再print, 结果如下:

(gdb) p *(A*)pObj1

$3 = {

Base = {

m_nNum = 10

},

members of A:

m_bCh = 65 'A'

}

这里便可以看到pObj1的m_bCh的值了。

3. 有了上面的经验,对于pObj2的m_bCh,就依上面2中的方法,直接上了,结果如下:

(gdb) p *(Test::A*)pObj2

A syntax error in expression, near `)pObj2'.

汗啊,居然提示说是语法错误,于是在网上找啊找,终于找到了解决的方法。

4. 下面是找到的方法,说是带namespace的强制转型要加单引号的,好诡异的语法:

(gdb) p *('Test::A'*)pObj2

$5 = {

test ::Base = {

m_nNum = 10

},

members of Test::A:

m_bCh = 65 'A'

}

通过上面一步步的介绍,相信读者朋友对GDB中结构类型的强制类型转换已经有了较为深入的了解,这里特别注意的就是第4步中提到的带namespace的结构类型,其它的跟C++基本中的类型的强制转换是一致的。

from:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值