这是在 C++ 上不起作用的相关 C 答案(作为结构的零初始值设定项):Initializing a struct to 0。提出的解决方案之一是:
myStruct _m1 = {0};
这在 C 中工作正常,但在 C++ 中不起作用。:( :
错误:无法使用类型为“int”的右值初始化“myScope::MyStruct”类型的成员子对象。
你如何在 C++ 中对结构进行零初始化?
我的问题不是另一个问题的重复(用空花括号初始化),因为另一个问题不是在询问在 C++ 中初始化结构的各种方法以及为什么 C 方法不起作用,而是它们是询问为什么 C++ 关键字会explicit
破坏他们的一种初始化技术。两个截然不同的问题。不重复。
我想通了:要让它编译,只需删除零:
myStruct _m1 = {};
它现在编译。然而,我运行了一堆测试来检查一些事情,这并没有将结构的所有元素初始化为零!相反,它将结构初始化为其默认值。
假设你有这个结构:
typedef struct
{
int num1 = 100;
int num2 = -100;
int num3;
int num4 = 150;
} data_t;
注意:typedef
上面是我在 C 而不是 C++ 中测试这些东西时的遗留物(当然,C 中不允许使用默认的结构值)。对于 C++,这是首选:
struct data_t
{
int num1 = 100;
int num2 = -100;
int num3;
int num4 = 150;
};
所以请在我不必要地typedef
用来定义下面的结构的地方忽略它。
无论如何,如果我声明上述data_t
结构之一,然后执行以下操作:
data_t d2 = {};
printf("d2.num1 = %i\nd2.num2 = %i\nd2.num3 = %i\nd2.num4 = %i\n\n",
d2.num1, d2.num2, d2.num3, d2.num4);
...输出将是:
d2.num1 = 100
d2.num2 = -100
d2.num3 = 0
d2.num4 = 150
而且我什至不确定它d2.num3
是零是因为它被初始化为零还是因为它没有初始化,并且该内存位置恰好包含零。
如此处所述:https : //en.cppreference.com/w/cpp/language/zero_initialization,您也可以这样做:
myStruct _m1{};
在上面的例子中,这段代码:
data_t d2{};
printf("d2.num1 = %i\nd2.num2 = %i\nd2.num3 = %i\nd2.num4 = %i\n\n",
d2.num1, d2.num2, d2.num3, d2.num4);
...会产生与我上面显示的相同的输出。
即使在将结构设置为= {0}
确实有效的情况下,例如:
// Does NOT do what I expected! Only sets the FIRST value in the struct to zero!
// The rest seem to use default values.
data_t d3 = {0};
printf("d3.num1 = %i\nd3.num2 = %i\nd3.num3 = %i\nd3.num4 = %i\n\n",
d3.num1, d3.num2, d3.num3, d3.num4);
...输出仍然不是我所期望的,因为它只将第一个值设置为零!(我不明白为什么):
d3.num1 = 0
d3.num2 = -100
d3.num3 = 0
d3.num4 = 150
然而,在 C 风格的数组(非结构)上,这些语义工作正常。请在此处参考此答案(如何将数组的所有成员初始化为相同的值?)。因此,以下几行在使用 C++ 时都将 C 样式数组的所有元素都设置为零:
uint8_t buffer[100] = {0}; // sets all elements to 0 in C OR C++
uint8_t buffer[100] = {}; // sets all elements to 0 in C++ only (won't compile in C)
因此,经过大量实验,看起来以下几种方法是对结构 PERIOD 进行零初始化的唯一方法。如果您有不同的了解,请在此处发表评论和/或留下您自己的答案。
明确:
// C-style typedef'ed struct
typedef struct
{
int num1 = 100;
int num2 = -100;
int num3;
int num4 = 150;
} data_t;
// EXPLICITLY set every value to what you want!
data_t d1 = {0, 0, 0, 0};
// OR (using gcc or C++20 only)
data_t d2 = {.num1 = 0, .num2 = 0, .num3 = 0, .num4 = 0}
使用memset()
强制所有字节为零:
data_t d3;
memset(&d3, 0, sizeof(d3));
首先将所有默认值设置为零:
// C-style typedef'ed struct
typedef struct
{
int num1 = 0;
int num2 = 0;
int num3 = 0;
int num4 = 0;
} data_t;
// Set all values to their defaults, which are zero in
// this case
data_t d4 = {};
// OR
data_t d5{}; // same thing as above in C++
// Set the FIRST value only to zero, and all the rest
// to their defaults, which are also zero in this case
data_t d6 = {0};
为 C++ 结构编写一个构造函数
// 1. Using an initializer list
struct data
{
int num1;
int num2;
int num3;
int num4;
data() :
num1(0),
num2(0),
num3(0),
num4(0) {}
};
data d7; // all values are zero
// OR: 2. manually setting the values inside the constructor
struct data
{
int num1;
int num2;
int num3;
int num4;
data()
{
num1 = 0;
num2 = 0;
num3 = 0;
num4 = 0;
}
};
data d8; // all values are zero
使用没有默认值的结构,并使用它创建您的对象 static
tpedef struct
{
int num1;
int num2;
int num3;
int num4;
} data_t;
// `static` forces a default initialization of zero for each
// value when no other default values are set
static data_t d9;
因此,如果您有一个具有非零默认值的结构,并且您想将所有值归零,您必须明确地做到这一点!这里还有一些方法:
// 1. Have a `constexpr` copy of the struct that you use to
// reset other struct objects. Ex:
struct data
{
int num1 = 1;
int num2 = 7;
int num3 = -10;
int num4 = 55;
};
constexpr data DATA_ALL_ZEROS = {0, 0, 0, 0};
// Now initialize d13 to all zeros using the above `constexpr` struct
// object
data d13 = DATA_ALL_ZEROS;
// OR 2. Use a `zero()` member function to zero the values:
struct data
{
int num1 = 1;
int num2 = 7;
int num3 = -10;
int num4 = 55;
zero()
{
num1 = 0;
num2 = 0;
num3 = 0;
num4 = 0;
}
};
data d14;
d14.zero();
data_t d{}
, data_t d = {}
, and 中的data_t d = {0}
任何一个实际上都将结构的所有成员设置为零!data_t d{}
将所有值设置为结构中定义的默认值。data_t d = {}
还将所有值设置为其默认值。data_t d = {0}
仅将 FIRST 值设置为零,并将所有其他值设置为其默认值。所以,要明确!
请注意,我写的上述关键要点似乎与本文档相矛盾,因此我提出了这个后续问题,在下面列为参考文献 #1,事实证明这对我的理解非常有帮助!
cpp/run_struct_initialization.sh
leds[0] = {10, 20, 30, 40, 50};
] Arduino Stack Exchange:初始化结构数组本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句