1. 程式人生 > >巨集定義在.h和.cpp中的差別

巨集定義在.h和.cpp中的差別

在mac os x 10.6  xcode4.2環境中遇到一個堆疊被破壞的bug,問題重現:

xcode中lib工程A,有類

classA{

int m_nj;

#define _DEBUG

int m_ni;

#endif

}

classA::classA

{

#ifdef _DEBUG

 m_ni = 0;

#endif

}

該工程巨集定義 _DEBUG


使用工程A的工程B中

使用程式碼{

int k = sizeof(classA) ;  

classA a;

}

1.  沒有巨集定義 _DEBUG   則在工程B中 

{

int k = sizeof(classA) ;   // k = 4

classA a; //執行完後  k = 0,  可能沒改變這個,但會改變其他記憶體,地址越界

}

2. 巨集定義_DEBUG 則在工程B中 sizeof(classA) 為8

{

int k = sizeof(classA) ;   // k = 8

classA a; //執行完後  k = 8

}

在1中 就破壞堆疊了,在2中完好。

可得出結論在這個環境中:工程B中使用時包含.h標頭檔案,而此時的.h檔案的巨集定義依賴工程B的工程巨集定義, 對應的.cpp依賴於自己(工程A)的巨集定義

在VS2003中經過測試,得到sizeof()與上訴一樣,只是除錯下 會自動斷點,記憶體越界

由此得到,巨集定義,在.h中依賴於被呼叫者的定義的巨集, 在.cpp中依賴於本工程定義的巨集,如不正確