我的代码:
#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_char [20]
之前
一切都好。但我想知道如何强制编译器接受带有char的“A2X”作为union中的第二个选项。谢谢你的帮助。long id_num
答案 0 :(得分:1)
但我想知道如何强制编译器接受&#34; A2X&#34;将char作为工会的第二选择。
您可以使用构造函数:
id(char const *id_char) {
std::strcpy(this->id_char, id_char);
}
或者,您可以使用widget
构造函数。
缺点是如果您使用太大的输入字符串进行初始化,编译器可能无法发出警告。显示的普通构造函数可以使用strlen
进行扩展,以检查运行时的溢出。如果您选择检查,我建议抛出异常。
答案 1 :(得分:0)
这适用于-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;
}