gdb中namespace的問題

2021-04-12 22:03:19 字數 2900 閱讀 1555

gdb中namespace的問題

由於 namespace能防止命名衝突,因此在許多任務程中會使用namespace。但是gdb

除錯的時候如果需要強制將

void*指標轉化成namespace中的某個struct或者class時,

會出現一些問題。下面通過舉例介紹解決的方法。

測試**如下所示,總共兩個檔案,在

test.h中使用了namespace,並在其中定

義了乙個

struct(class跟struct類似)。在test.cpp中展示了兩種使用namespace的

方法,並定義了乙個

void * 的指標,該指標指向namespace結構定義的乙個變數,主

要展示如何在

gdb中察看該void*指標的內容。主要使用了gcc 3.2.2和gcc 3.4.3兩個

編譯器(分別對應

redhat 9.0和redhat as4)。

/****************************

test.h

*****************************/

ifndef __test_h__

#define __test_h__

namespace mynamespace;}

#endif

/****************************

test.cpp

*****************************/

#include

#include "test.h"

using

namespace std;

int main();

int * pi = &itest;

ttest * pt = &sttest; */

// way 2

mynamespace::itest = 10;

mynamespace::ttest sttest = ;

int * pi = & mynamespace::itest;

mynamespace::ttest * pt = &sttest;

void * pv = &sttest;   //target: get the value of pv in gdb

cout << "pi = " << *pi << endl;

cout << "pt->_ival = " << pt->_ival << endl;

cout << "pt->_cval = " << pt->_cval << endl;

return 0;

}上述兩種使用

usespace的方式得到的結果均如下:

///

//gcc 3.2.2

///(gdb) p pi

$1 = (

int *) 0x8049bac

(gdb) p pt

$2 =

(ttest *) 0xbffff550

/////gcc 3.4.3

///(gdb) p pi

$1 = (

int *) 0x8049db8

(gdb) p pt

$2 =

(mynamespace::ttest *) 0xbfeeb840

由上述結果可以看出

gcc 3.2.2下識別pt是ttest *型別,因此獲得pv的

值可以強制轉化成

ttest*即可,如下所示:

(gdb)p *(ttest*)pv

$3 =

(gdb)p ((ttest*)pv)->_ival

$4 = 10

(gdb)p ((ttest*)pv)->_cval

$5 = 97 'a'

但是在 gcc 3.4.3中pt卻被識別成mynamespace::ttest *型別,而像上面

一樣使用強制轉化卻出現問題:

(gdb)p *(mynamespace::ttest*)pv

a syntax error in expression, near `)pv'.

因此需要強制表示該符號型別,如下所示:

(gdb)

p *('mynamespace::ttest' *)pv

$3 =

(gdb)p (*('mynamespace::ttest' *)pv)->_ival

$4 = 10

(gdb)p (*('mynamespace::ttest' *)pv)->_cval

$5 = 97 'a'

即要使用符號''來強制說明一下,否則

gcc會不認識該符號。另外如果在

gcc 3.2.2中使用

p *('mynamespace::ttest' *)pv,則會報錯:

no symbol "mynamespace" in current context.

因此, namespace在不同的編譯器中處理是不一樣的,主要還是用p命令來

察看其具體被識別成什麼型別,然後使用強制轉化即可,注意的是如果被識

別成 mynamespace::**時,使用強制轉化時需要使用符號''來強制轉化。當然

記憶體位址轉化也同樣如此。

C 中的全域性namespace

我們應該知道傳統的c 只有乙個全域性的namespace,但是由於現在的程式的規模越來越大,程式的分工越來越細,全域性作用域變得越來越擁擠,每個人都可能使用相同的名字來實現不同的庫,於是程式設計師在合併程式的時候就會可能出現名字的衝突。namespace引入了複雜性,解決了這個問題。namespac...

C 中namespace的使用

c 中經常會使用到namespace關鍵字,那麼到底什麼是namespace呢?它有什麼用呢?namespace直譯就是命名空間的意思,它是一種邏輯分組機制,將按照某些標準在邏輯上屬於同乙個任務的所有類宣告放在同乙個命名空間。最常用到的using namespace std就是在標準c 中所有包含的...

C 中namespace的用法

c 語言提供乙個全域性的命名空間namespace,可以避免導致全域性命名衝突問題。舉乙個例項,請注意以下兩個標頭檔案 one.h char func char class string somelib.h class string 如果按照上述方式定義,那麼這兩個標頭檔案不可能包含在同乙個程式中,...