在Win32 API编程中,通常使用struct具有多个字段的C s.通常只有其中几个具有有意义的值,而其他所有值都必须归零.这可以通过以下两种方式之一实现:
STRUCT theStruct;
memset( &theStruct, 0, sizeof( STRUCT ) );
Run Code Online (Sandbox Code Playgroud)
要么
STRUCT theStruct = {};
Run Code Online (Sandbox Code Playgroud)
第二个变体看起来更干净 - 它是一个单行,它没有任何可能输错的参数并导致错误被种植.
与第一个变体相比,它有任何缺点吗?使用哪种变体?为什么?
我正在读取默认情况下数组/结构的初始值,并有这个问题:
是memset(&mystruct, 0, sizeof mystruct)一样的mystruct = { 0 };?
如果不是,有什么区别?
一般来说,根据C标准,保证带有0的memset()会将C结构中的填充位清零吗?
那gcc怎么样?
例如,类似于:
struct MyStruct
{
unsigned char member1;
unsigned int member2;
char member3;
unsigned char member4;
float member5;
};
struct MyStruct ms;
memset(&ms, 0, sizeof( struct MyStruct));
Run Code Online (Sandbox Code Playgroud) 假设我们有这样的结构:
struct A
{
int x;
int y;
};
Run Code Online (Sandbox Code Playgroud)
有什么区别
A a = {0};
Run Code Online (Sandbox Code Playgroud)
和
A a;
memset(&a,0,sizeof(A));
Run Code Online (Sandbox Code Playgroud) 在C/C++混合项目中,我发现了一些我可以减少的代码
#include <mem.h>
struct StructContainingDouble
{
double d;
/// other elements omitted
};
void clear(StructContainingDouble* p)
{
memset(p, 0, sizeof *p);
}
Run Code Online (Sandbox Code Playgroud)
不停止Cppcheck提高可移植性警告
在包含浮点数的struct上使用memset().
消息是正确的,但由于浮点数被声明为double,因此它似乎是误报,因为在(正)零值的两倍中,按照IEEE 754标准进行编码:[*]
0 00000000000 0000000000000000000000000000000000000000000000000000
Run Code Online (Sandbox Code Playgroud)
因此,我倾向于简单地压制警告而忘记它
void clear(ContainingDouble* p)
{
// cppcheck-suppress memsetClassFloat
memset(p, 0, sizeof *p);
}
Run Code Online (Sandbox Code Playgroud)
但也许这里真的存在可移植性问题?
实际代码基于Win32平台.该结构用于管理对共享内存的访问,这就是构造函数无用的原因.而且不仅是该结构的一个对象必须归零,而是嵌入另一个结构的数组,如下所示:
#include <mem.h>
struct Slot
{
double d;
// more members...
};
struct SharedMem
{
Slot slots[2048];
// more members...
};
void clear(SharedMem* p)
{
memset(p, 0, sizeof *p);
}
Run Code Online (Sandbox Code Playgroud)
[*] from: …