裸结构体(raw structure)的自动初始化

ZDNet软件频道 时间:2003-05-14 作者:翻译:Java研究组织-郭晓刚 |  我要评论()
本文关键词:cpptips
在和旧的C APIs或者Win32 APIs打交道的时候,程序员常常发现在使用裸结构体(raw structure)前要先初始化它们。本文的raw_initialize函数自动完成了上面的整个过程。
本文译自Builder.com,未经许可请勿转载在和旧的C APIs或者Win32 APIs打交道的时候,程序员常常发现在使用裸结构体(raw structure)前要先初始化它们。(裸结构体是只有数据没有方法的一种结构体。)

有好几种方法来初始化一个裸结构体,包括:

  • memset
  • ZeroMemory (Win32)
  • FillMemory (Win32)

但上面的方法是容易出错的,因为你可能初始化了太多或太少的内存。而且,为了正确地初始化一个裸结构体,你不得不总是使用sizeof:

LVITEM itemData;
memset( &itemData, 0, sizeof( itemData));

下面的raw_initialize函数自动完成了上面的整个过程,并且不容易出错:

#include <string.h>

template< class T>
    void raw_initialize( T & value, char chFill = 0)
{
    memset( (void *)&value, chFill, sizeof( T));
}

使用raw_initialize的时机:

  • 用它来避免隐含的错误(如果你没有显式初始化一个结构,它的内容是未定义的)。
  • 在debug的时候使用,以确保结构体被适当地初始化/填充了(也就是说,先用raw_initialize初始化它,然后调用真正用来初始化/填充这个结构体的函数;这样你可以看清楚到底哪里被改变了)。
  • 在处理裸C结构体或Win32结构体的时候。

下面是一个应用raw_initialize的例子:

#include <windows.h>
#include <commctrl.h>

// . . . code

HWND hList = /* find the List View window */;
LVITEM itemData;
raw_initialize( itemData);
// we're setting the text and image
itemData.mask = LVIF_TEXT | LVIF_IMAGE;
itemData.iImage = 1;
itemData.pszText = "This is some new text";
ListView_SetItem( hList, &itemData);



责任编辑:炒饭

欢迎评论或投稿


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134