b5cbb3ac
驱动牛犊
驱动牛犊
  • 注册日期2003-01-23
  • 最后登录2004-01-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1300回复:5

欢迎讨论以下程序,欢迎C/C++高手进来给提示

楼主#
更多 发布于:2003-02-08 12:22

欢迎讨论以下程序,欢迎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以后就退出堆栈。
问题:
   编译的时候把结构定义压入堆栈和一般的有什么不同?
   文件提示说可以获得更稳定,这种稳定怎样得到的?
petz
禁止发言
禁止发言
  • 注册日期2001-03-23
  • 最后登录2015-12-19
  • 粉丝0
  • 关注0
  • 积分-22276分
  • 威望15点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-02-10 11:33
用户被禁言,该主题自动屏蔽!
b5cbb3ac
驱动牛犊
驱动牛犊
  • 注册日期2003-01-23
  • 最后登录2004-01-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-02-10 10:38
我刚才用VC6试了以下,
我的推测是对的。
再次谢谢zoujie!!
b5cbb3ac
驱动牛犊
驱动牛犊
  • 注册日期2003-01-23
  • 最后登录2004-01-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于: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]
petz
禁止发言
禁止发言
  • 注册日期2001-03-23
  • 最后登录2015-12-19
  • 粉丝0
  • 关注0
  • 积分-22276分
  • 威望15点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-02-09 10:43
用户被禁言,该主题自动屏蔽!
nter0
驱动牛犊
驱动牛犊
  • 注册日期2002-12-10
  • 最后登录2008-11-17
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-02-08 15:34
我不明白你为什么要这样做,清说清楚点
游客

返回顶部