阅读:1299回复:5
欢迎讨论以下程序,欢迎C/C++高手进来给提示欢迎讨论以下程序,欢迎C/C++高手进来给提示 程序如下: //////////////////////////////////////////////////////////////// // 文件1: pshpack1.h #if ! (defined(lint) || defined(RC_INVOKED)) #if ( _MSC_VER >= 800 ) || defined(_PUSHPOP_SUPPORTED) #pragma warning(disable:4103) #if !(defined( MIDL_PASS )) || defined( __midl ) #pragma pack(pop) #else #pragma pack() #endif #else #pragma pack() #endif #endif // ! (defined(lint) || defined(RC_INVOKED)) //////////////////////////////////////////////////////////////// // 文件2 poppack.h #if ! (defined(lint) || defined(RC_INVOKED)) #if ( _MSC_VER >= 800 ) || defined(_PUSHPOP_SUPPORTED) #pragma warning(disable:4103) #if !(defined( MIDL_PASS )) || defined( __midl ) #pragma pack(pop) #else #pragma pack() #endif #else #pragma pack() #endif #endif // ! (defined(lint) || defined(RC_INVOKED)) 按照我的理解: 它是在编译的时候把这个头文件以后的代码中struct, union 等 定义压如堆栈,调用文件2以后就退出堆栈。 问题: 编译的时候把结构定义压入堆栈和一般的有什么不同? 文件提示说可以获得更稳定,这种稳定怎样得到的? |
|
沙发#
发布于:2003-02-08 15:34
我不明白你为什么要这样做,清说清楚点
|
|
板凳#
发布于:2003-02-09 10:43
用户被禁言,该主题自动屏蔽! |
|
地板#
发布于:2003-02-10 10:11
非常感谢zoujie!
是的,我第一个文件贴错了,两个文件内容不是相同的! 第一个PUSH的文件应该是: #if ! (defined(lint) || defined(RC_INVOKED)) #if ( _MSC_VER >= 800 ) || defined(_PUSHPOP_SUPPORTED) #pragma warning(disable:4103) #if !(defined( MIDL_PASS )) || defined( __midl ) #pragma pack(push,1) #else #pragma pack(1) #endif #else #pragma pack(1) #endif #endif // ! (defined(lint) || defined(RC_INVOKED)) 这是我在看USB驱动时看到的头文件,我当时对这种头文件的包括感觉到困惑不已。 如果按照你所说的,TEST用对齐指令为4个字节,sizeof(TEST)等于8。我用一个BYTE 的指针p指向TEST 的对象,如下: TEST a; BYTE *p = NULL; p = (BYTE*)&a; p[0] = 1; p[1] = 2; p[2] = 3; p[3] = 4; p[4] = 5; 这样的强行赋直就会产生错误?所得到的var1 = 1; 但var2就不等于3254 ? 只有在对齐指令是1的时候才var2才等于0x3254? 还请不吝指教! [编辑 - 2/10/03 by b5cbb3ac] [编辑 - 2/10/03 by b5cbb3ac] |
|
地下室#
发布于:2003-02-10 10:38
我刚才用VC6试了以下,
我的推测是对的。 再次谢谢zoujie!! |
|
5楼#
发布于:2003-02-10 11:33
用户被禁言,该主题自动屏蔽! |
|