What does {0} mean when initializing an object?
When {0}
is used to initialize an object, what does it mean? I can't find any references to {0}
anywhere, and because of the curly braces Google searches are not helpful.
Example code:
SHELLEXECUTEINFO sexi = {0}; // what does this do?
sexi.cbSize = sizeof(SHELLEXECUTEINFO);
sexi.hwnd = NULL;
sexi.fMask = SEE_MASK_NOCLOSEPROCESS;
sexi.lpFile = lpFile.c_str();
sexi.lpParameters = args;
sexi.nShow = nShow;
if(ShellExecuteEx(&sexi))
{
DWORD wait = WaitForSingleObject(sexi.hProcess, INFINITE);
if(wait == WAIT_OBJECT_0)
GetExitCodeProcess(sexi.hProcess, &returnCode);
}
Without it, the above code will crash on runtime.
What's happening here is called aggregate initialization. Here is the (abbreviated) definition of an aggregate from section 8.5.1 of the ISO spec:
An aggregate is an array or a class with no user-declared constructors, no private or protected non-static data members, no base classes, and no virtual functions.
Now, using {0}
to initialize an aggregate like this is basically a trick to 0
the entire thing. This is because when using aggregate initialization you don't have to specify all the members and the spec requires that all unspecified members be default initialized, which means set to 0
for simple types.
Here is the relevant quote from the spec:
If there are fewer initializers in the list than there are members in the aggregate, then each member not explicitly initialized shall be default-initialized. Example:
struct S { int a; char* b; int c; };
S ss = { 1, "asdf" };
initializes ss.a
with 1
, ss.b
with "asdf"
, and ss.c
with the value of an expression of the form int()
, that is, 0
.
You can find the complete spec on this topic here
One thing to be aware of is that this technique will not set padding bytes to zero. For example:
struct foo
{
char c;
int i;
};
foo a = {0};
Is not the same as:
foo a;
memset(&a,0,sizeof(a));
In the first case, pad bytes between c and i are uninitialized. Why would you care? Well, if you're saving this data to disk or sending it over a network or whatever, you could have a security issue.
请注意,一个空的聚合初始值设定项也适用:
SHELLEXECUTEINFO sexi = {};
char mytext[100] = {};
链接地址: http://www.djcxy.com/p/12524.html
上一篇: 可变的可移植使用printf家族?
下一篇: 初始化对象时,{0}意味着什么?