GDBにおけるC++構造タイプの強制タイプ変換(namespace付きの強制変換には一重引用符を付ける)

2119 ワード

今日デバッガの過程で出会った小さな問題をここに記録して、同じ問題に遭遇した友达に役に立つことを望んでいます.
次のプログラムをインスタンスとして説明します.
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行でブレークポイントを設定して、どのようにpObj 1とpObj 2のm_を表示しますbChの値は?
1.最初の試み、直接p*pObj 1、結果は以下の通り.
1
2
3
4
(gdb) p *pObj1
$1 = {
  m_nNum = 10
}

2.最初の試みの結果から、強制型の転換を考えて、サブクラスAのポインタ型に変換してからprintして、結果は以下の通りです.
1
2
3
4
5
6
7
8
(gdb) p *(A*)pObj1 
$3 = {
    Base = {
    m_nNum = 10
  }, 
  members of A: 
  m_bCh = 65 'A'
}

ここでpObj 1のm_を見ることができますbChの値です.3.上記の経験があり、pObj 2のm_bChは、上記2の方法に従って、直接上がって、結果は以下の通りです.
1
2
(gdb) p *(Test::A*)pObj2
A syntax error in expression, near `)pObj2'.

汗、意外にも文法の間違いだとヒントを与えて、そこでネットで探して探して、ついに解決の方法を見つけました.4.次の方法は、namespace付きの強制的な転換に単一引用符を付けるという奇妙な文法です.
1
2
3
4
5
6
7
8
(gdb) p *('Test::A'*)pObj2
$5 = {
   test ::Base = {
    m_nNum = 10
  }, 
  members of Test::A: 
  m_bCh = 65 'A'
}

上記の手順では、GDBにおける構造タイプの強制タイプ変換について、読者の友人が深く理解していると信じています.ここで特に注意しているのは、第4のステップで述べたnamespace付きの構造タイプであり、他のC++基本のタイプの強制変換と一致しています.