2012-05-21 86 views
0

它是一个不好的做法,没有明确设置一个结构的每个成员的值,例如在CHARFORMAT结构,你可以声明初始化这一切在这样一行:好的,以使用初始化程序列表来初始化Windows API结构?

CHARFORMAT foo = {sizeof(CHARFORMAT),CFM_FACE,0,0,0,0,0,0,"Arial"}; 

我特别喜欢做这样做的原因不仅在于键入的少,而且我不必调用_tcscpy或类似的东西来复制到szFaceName的字符串值中。我不确定这是否更快,我不在乎它是否是,我不打算移植或更改编译器,SDK库或任何东西。

我想知道的是,这样做会不会影响init?如果是这样,涉及的风险显然不值得麻烦吗?我是否应该避免用这种方式初始化结构,只是明确地做到这一点?

+0

脚注:目前我使用这个编译器/连接: –

+0

微软(R)32位C/C++优化编译器版本12.00.8168 微软(R)增量链接器版本6.00.8168 微软(R)库管理器版本6.00.8168 IDE:notepad2.exe和msdev.exe(visual c + + 6.0) (全部为80x86) –

+0

这甚至编译? – cen

回答

-1

我不会这样做,因为它容易出错并且无法阅读。如果需要调整代码,则意外插入或删除初始化程序(或替换错误的代码)太容易了。

注意,您可以通过让编译器避免了某些类型的零初始化大部分成员为您提供:

CHARFORMAT foo = { 0 }; 
foo.cbSize = sizeof foo; 
foo.dwMask = CEM_FACE; 
_tcscpy_s(foo.szFaceName, _countof(foo.szFaceName), T("Arial")); 

不幸的是,有没有避免strcpy电话(尤其是因为微软编译器不支持C99指定的初始化器)。

+0

首先,我向你提出了基本上是正确的事情,然后我被迫让你失望。 tscpy? T()?你从1990年传送到这里吗? – Puppy

+0

@Puppy哇,你为此低估了我?这有点小气。我的答案中是否有任何错误*?字符类型与问题无关,并且OP已经在使用非宽字符串,所以我正在向UTF-16过渡。天啊。 – jamesdlin