宏定义在.h和.cpp中的差别

来源:互联网 发布:c语言产生1-100随机数 编辑:程序博客网 时间:2024/05/07 22:11
在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中依赖于本工程定义的宏,如不正确


0 0
原创粉丝点击