代码:
WINDOWPLACEMENT wplcmt = {sizeof(WINDOWPLACEMENT)};
看起来比以前更清洁:
WINDOWPLACEMENT wplcmt;
memset(&wplcmt, 0, sizeof(WINDOWPLACEMENT));
wplcmt.length = sizeof(WINDOWPLACEMENT);
这个东西的组装输出也很不错,对于更长的结构,MSVC甚至使用memset
而不是xor eax, eax
和mov
。从标准的角度来看,它看起来也不错。但我仍然害怕结构没有紧密包装的边界情况说#pragma pack(128)
,并且窗户突然决定对结构进行记忆。
使用这样的语法是好还是坏? 使用这种初始化是一种好习惯吗?
答案 0 :(得分:8)
您展示的第二个代码,
WINDOWPLACEMENT wplcmt;
memset(&wplcmt, 0, sizeof(WINDOWPLACEMENT));
wplcmt.length = sizeof(WINDOWPLACEMENT);
太可怕了。混淆,效率低下,冗长,你把它全部塞进去了。
第一个代码段,
WINDOWPLACEMENT wplcmt = {sizeof(WINDOWPLACEMENT)};
除了混淆之外,是首选方式,除非您想要
花费更多时间不必要地编写更多代码,
让读者花更多时间阅读并不必要地分析您的详细代码,
执行效率较低,
提供错误输入门户。
顺便说一句,您使用的模糊名称是什么,wplcmt
?
为什么要混淆名字?
你的问题是真的还是只是拖钓?
干杯&第h。,
编辑:问题已被修改。以上问题是对原始标题/问题的回应,"这种结构分配有多邪恶?"。我将答案保留原样,为评论提供背景信息。
编辑2 :情境进一步发生了变化:OP的昵称从" Madman"到" Coder"。所以,虽然原作是关于"如何eveil"正常的代码由"狂人",它现在关于"它是否首选......" by" Coder"。噢,我的意思是,我没有打电话给他"狂人"在评论中,就像现在看来一样;这就是他所谓的自己,当时他的昵称。
答案 1 :(得分:7)
使用memset。然后每个人都会立即看到代码的作用,并且不太可能产生任何意想不到的副作用。
答案 2 :(得分:1)
这种初始化我经常与之斗争。在C99中,人们可以做到:
WINDOWPLACEMENT wplcmt = {.length = sizeof(wplcmt), .showCmd = SW_SHOW};
其他值为零初始化。
在G ++中你可以这样做:
WINDOWPLACEMENT wplcmt = {length: sizeof(wplcmt), showCmd: SW_SHOW};
最后在C ++中,您可以选择初始化所有成员,还是希望您获得正确的成员顺序:
WINDOWPLACEMENT wplcmt = {sizeof(wplcmt)};
WINDOWPLACEMENT wplcmt = {sizeof(wplcmt), 0, SW_SHOW, {0, 0}, {0, 0}, {0, 0, 0, 0}};
事实上,在最后一种情况下,我甚至不确定所有C ++编译器都支持复合文字初始化。此外,如果成员更改订单或键入,并且您的值仍然适合您将不会出现错误。
就我个人而言,我个人选择使用C99,我会在一次点击中声明你给出的结构,并且所有已知的值都是这样的:
WINDOWPLACEMENT const wplcmt = {.length = sizeof(wplcmt), .showCmd = SW_SHOW};
我所提到的“初始化全部”似乎只适用于数组?我的错误,这使得C ++稍微有用。
答案 3 :(得分:0)
答案 4 :(得分:0)
如果您使用Visual Studio,我强烈建议您使用:
WINDOWPLACEMENT wplcmt;
SecureZeroMemory((LPVOID)&wplcmt, sizeof(WINDOWPLACEMENT));
wplcmt.length = sizeof(WINDOWPLACEMENT);
因为优化编译器可以完全从生成的代码中删除 memset 调用,如果你真的需要将这些值设置为零,会导致很多麻烦。
永远不会删除SecureZeroMemory 。