微软为啥“多此一举”?
类似:
SHMENUBARINFO info;
info.cbSize = sizeof(info);//问题:既然info已经有确定的大小了,就是可以用sizeof取得其大小,为什么微软还要设置cbSize这样的参数?

解决方案 »

  1.   

    没有多此一举,之后的SHMENUBARINFO 版本可能比之前的多两个成员,那么你用的时候会不会有问题呢?
    所以需要这个大小来确定。
      

  2.   

    可是既然都可以sizeof(info);这样得到其确定大小了,这已经是确定的,可以用sizeof得到了。又何必在SHMENUBARINFO 内部再设置cbSize?
      

  3.   

    假如你的sdk是新版本的,而dll是旧版本的。
    就版本中有4个变量,而你的sdk中有5个变量,这个时候在你的程序中得到的sizeof和dll中得到的sizeof是一样的么?
      

  4.   

    c语言中有sizeof运算符,你能保证其他语言中有么,汇编中你不指定大小,怎么能知道这个数据结构有多大。
      

  5.   

    如果程序中要用到info的大小,不止一次呢,上百次 上万次呢?用多少次sizeof()就要计算多少次,而计算一次把结果保存到info.cbSize中 在用的时候直接用bSize 而不去计算,这样不就是提高了运行效率(个人理解)
      

  6.   

    to flameearth()
    sizeof 运算是在编译期完成的(个人理解)
      

  7.   

    TO:WingForce(初六,履霜,坚冰至。) 
    但是最新的C99标准规定sizeof也可以在运行时刻进行计算,而Vc6中没有完全实现新的C99
    而微软程序员这么写,想必他也考虑到这些了吧,我觉得这么写我觉得是一种很好的习惯
      

  8.   

    原因是这样的: 编译好的程序是不能知道还没有编译的程序的结构体的大小的,
    编译好的程序只能处理字节,不能处理结构体。如果微软的DLL中用到了一个结构体,
    如果DLL中要拷贝这个结构体,就要知道这个结构体的大小。
    而结构体的大小是可以变的,而dll中是不能知道用户程序中结构体的大小的。因为dll已经编译好了。 dll中的 sizeof(struct)是微软公司在发布这个dll的时候struct的大小,已经写死在dll中了,作为4个字节写死在dll里了。
      

  9.   

    但是最新的C99标准规定sizeof也可以在运行时刻进行计算
    ==============
    dll运行的时候,怎么自动感知外部结构体的大小?dll里只能分辨0和1,结构体和类型是编译的时候的事情。运行时类型? 我也不太明白。
      

  10.   

    sizeof运行时刻计算大小应该说的是指针,如sizeof(p)。像结构体大小这种是编译时计算的。