sha*_*oth 14 c c++ winapi struct initialization
在Win32编程中,使用了一些POD结构.这些结构通常需要在使用前清零.
这可以通过调用memset()/ 来完成ZeroMemory()
STRUCT theStruct;
ZeroMemory( &theStruct, sizeof( theStruct ) );
Run Code Online (Sandbox Code Playgroud)
或者通过值初始化:
STRUCT theStruct = {};
Run Code Online (Sandbox Code Playgroud)
虽然上面的两个变体通常不相同:
在Win32中使用的POD结构的情况下,它们看起来相同.
是否有任何情况何时memset()/ ZeroMemory()应该使用Win32 POD结构而不是值初始化?
小智 23
我一直用:
STRUCT theStruct = {}; // for C++, in C use {0}
Run Code Online (Sandbox Code Playgroud)
它更短,更标准,因此更优雅,我并不真正关心理论上的差异.我们在这里讨论具体操作系统的代码.
另一个优点是你也可以在第一个成员中立即设置结构大小,如下所示:
STRUCT theStruct = {sizeof(STRUCT)};
Run Code Online (Sandbox Code Playgroud)
许多Win32结构要求您在第一个成员中设置大小.
小智 10
在Win32中,ZeroMemory只是一个宏周围RtlZeroRemory,这是一个memset的宏.所以,我不认为它有所作为.
WinBase.h:
\#define ZeroMemory RtlZeroMemory"
Run Code Online (Sandbox Code Playgroud)
WinNT.h:
\#define RtlZeroMemory(Destination,Length) memset((Destination),0,(Length))
Run Code Online (Sandbox Code Playgroud)
如果您的代码将作为无数可能不会注意到或理解 C++= {}构造的 Visual Basic 开发人员的示例,ZeroMemory 是一个好方法,可以使 C++ 代码看起来更像伪代码,并最大限度地减少微妙的、令人毛骨悚然的初始化的发生率错误。
这是MSDN 文章作者所面临的担忧,这也解释了为什么 ZeroMemory 出现在如此多的代码(甚至 C++ 代码)中。
另一方面,如果 C++ 代码的目的是制作一个可用的产品,而不是教导世界,那么使用 C++ 语言的优雅和表达能力是一个好主意。