我的代码:
#include <iostream>
using namespace std;
struct widget
{
char brand[20];
int type;
union id
{
long id_num;
char id_char[20];
}id_val;
};
int main()
{
widget prize =
{"Rolls", 0, "A2X"};
return 0;
}当在结构中初始化一个联合时,问题在于初始化"A2X“。编译器不知道当我传递"A2X“时,我想选择第二个字符数组选项,它需要长类型。当我把
char id_char20
在此之前
长id_num
一切都很好。但我想知道如何强制编译器接受"A2X“,而char是联合中的第二个选项。谢谢你的帮助。
发布于 2017-07-23 21:58:08
但我想知道如何强制编译器接受"A2X“,而char是联合中的第二个选项。
您可以使用构造函数:
id(char const *id_char) {
std::strcpy(this->id_char, id_char);
}或者,您可以使用widget构造函数。
一个缺点是,如果您使用太大的输入字符串进行初始化,编译器可能无法警告您。可以用strlen扩展显示的简单构造函数,以在运行时检查溢出。如果您选择检查,我建议您抛出一个异常。
发布于 2017-07-23 22:01:15
这适用于-std=c++11
#include <cstring>
#include <stdexcept>
struct widget
{
char brand[20];
int type;
union id
{
long id_num;
char id_char[20];
}id_val;
widget(char const*Str, int Type, char const *Id);
};
widget::widget(char const*Str, int Type, char const *Id)
{
if (strlen(Str)+1 > sizeof brand)
throw std::length_error{"brand too large"};
memcpy(brand,Str,strlen(Str)+1);
type = Type;
if (strlen(Id)+1 > sizeof id_val.id_char)
throw std::length_error{"id too large"};
memcpy(id_val.id_char,Id,strlen(Id)+1);
}
int main()
{
widget prize = {"Rolls", 0, "A2X"};
return 0;
}https://stackoverflow.com/questions/45270196
复制相似问题