C++ 如何在C++;
下面是一个在C++上不起作用的相关C答案(作为结构的零初始值设定项):。提出的解决方案之一是:C++ 如何在C++;,c++,struct,initialization,C++,Struct,Initialization,下面是一个在C++上不起作用的相关C答案(作为结构的零初始值设定项):。提出的解决方案之一是: myStruct _m1 = {0}; 这在C中很好,但是在C++中不起作用。(: 错误:无法使用“int”类型的右值初始化“myScope::MyStruct”类型的成员子对象 打破了它们的初始化技术两个不同的问题。删除零: myStruct _m1 = {}; 它现在可以编译。但是,这并不是将结构的所有元素初始化为零!而是将结构初始化为其默认值 假设您有此结构: typedef struct
myStruct _m1 = {0};
<>这在C中很好,但是在C++中不起作用。(:
错误:无法使用“int”类型的右值初始化“myScope::MyStruct”类型的成员子对象
<如何在C++中初始化零结构?
相关的:
我的问题不是另一个问题的重复()这个问题不是问C++中初始化结构的各种方式,以及为什么C方法不起作用,而是问<强>为什么C++关键字<代码>显式< /代码>打破了它们的初始化技术<强>两个不同的问题。删除零:
myStruct _m1 = {};
它现在可以编译。但是,这并不是将结构的所有元素初始化为零!而是将结构初始化为其默认值
假设您有此结构:
typedef struct
{
int num1 = 100;
int num2 = -100;
int num3;
int num4 = 150;
} data_t;
<> >注意:上面的代码< TyPulf< /Cord>是我在C++中测试这个东西而不是C++的一个转载(当然,默认的结构值在C中是不允许的)。对于C++,这是首选:
因此,如果我不必要地使用typedef
来定义下面的结构,请忽略它
无论如何,如果我声明上述数据\u 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是否为零,因为它被初始化为零,或者因为它未被初始化,而内存位置恰好包含零
如此处所述,您还可以执行以下操作:
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);
…输出仍然不是我期望的,因为它只将第一个值设置为零!(我不明白为什么):
但是,在C-style数组上(不是结构),这些语义工作得很好。请参阅此处的答案()。因此,在使用C++时,以下两行都将C-style数组的所有元素设置为零:
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)
因此,以下几种方法似乎是对结构进行零初始化的唯一方法,句号。如果您知道不同的方法,请在此处进行注释和/或留下您自己的答案
能够在C++中初始化一个结构的唯一方法。
// 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};
// 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
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();
数据{}
,数据{}
,和数据{0}
,实际上都没有将结构的所有成员设置为零!
data\u t d{}
将所有值设置为结构中定义的默认值data\u t d={}
还将所有值设置为默认值data_t d={0}
仅将第一个值设置为零,将所有其他值设置为默认值cpp/run\u struct\u initialization.sh运行代码
led[0]={10,20,30,40,50};
]我想出来了:要编译它,只需删除零:
myStruct _m1 = {};
它现在可以编译。但是,这并不是将结构的所有元素初始化为零!而是将结构初始化为其默认值
假设您有此结构:
typedef struct
{
int num1 = 100;
int num2 = -100;
int num3;
int num4 = 150;
} data_t;
<> >注意:上面的代码< TyPulf< /Cord>是我在C++中测试这个东西而不是C++的一个转载(当然,默认的结构值在C中是不允许的)。对于C++,这是首选:
因此,如果我不必要地使用typedef
来定义下面的结构,请忽略它
无论如何,如果我声明上述数据\u 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是否为零,因为它被初始化为零,或者因为它未被初始化,而内存位置恰好包含零
如此处所述,您还可以执行以下操作:
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);
…输出仍然不是我期望的,因为它只将第一个值设置为零!(我不明白为什么):
但是,在C-style数组上(不是结构),这些语义工作得很好。请参阅此处的答案()。因此,在使用C++时,以下两行都将C-style数组的所有元素设置为零:
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)
所以,看起来以下几种方法是唯一的归零方法