巨集定義在.h和.cpp中的差別
阿新 • • 發佈:2018-12-30
在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中依賴於本工程定義的巨集,如不正確