У меня есть программа, которая отображает регистрации устройств в союзах битфилд и целых числа. Это часть более крупной кодовой базы, поэтому, хотя это очень код C-стиля, мы компилируем его как C ++ 20. Вот надуманный пример, который соответствует тому, что у нас было.#include
typedef union {
uint16_t reg;
struct {
uint16_t x : 4;
uint16_t y : 4;
uint16_t z : 4;
};
} PositionReg;
typedef union {
uint16_t reg;
struct {
uint16_t yaw : 4;
uint16_t pitch : 4;
uint16_t roll : 4;
};
} AttitudeReg;
typedef struct {
PositionReg xyz;
AttitudeReg ypr;
} Frame;
uint16_t get_position() {
return 0xDEAD;
}
uint16_t get_attitude() {
return 0xBEEF;
}
// This compiles
Frame get_frame() {
Frame f = {
.xyz = get_position(),
.ypr = get_attitude(),
};
return f;
}
// This won't compile
Frame get_frame_broken() {
PositionReg xyz = get_position();
AttitudeReg ypr = get_attitude();
Frame f;
f.xyz = xyz;
f.ypr = ypr;
return f;
}
Я не понимаю, почему она сломалась, когда я добавил функцию get_frame_brken . Компилятор не имел проблемы неявно преобразовать UINT16_T в PositionReg внутри назначенного инициализатора, но когда я пытаюсь сделать это за пределами назначенного инициализатора, он не может компилировать со следующей ошибкой (ссылка Godbolt)
: In function 'Frame get_frame_broken()':
:46:35: error: conversion from 'uint16_t' {aka 'short unsigned int'} to non-scalar type 'PositionReg' requested
46 | PositionReg xyz = get_position();
| ~~~~~~~~~~~~^~
:47:35: error: conversion from 'uint16_t' {aka 'short unsigned int'} to non-scalar type 'AttitudeReg' requested
47 | AttitudeReg ypr = get_attitude();
| ~~~~~~~~~~~~^~
Compiler returned: 1
< /code>
Почему это вызывает ошибку? Или я застрял, разделяя его на две строки, такие как это: < /p>
// This compiles
Frame get_frame_broken() {
// PositionReg xyz = get_position();
// AttitudeReg ypr = get_attitude();
PositionReg xyz;
AttitudeReg ypr;
xyz.reg = get_position();
ypr.reg = get_attitude();
Frame f;
f.xyz = xyz;
f.ypr = ypr;
return f;
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... but-otherw
Неявное преобразование из int в Union Works в назначенном инициализаторе, но в противном случае не может компилировать ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как преобразовать список[int, int, int] в кортеж[int, int, int], а не в кортеж[int, ...]
Anonymous » » в форуме Python - 0 Ответы
- 288 Просмотры
-
Последнее сообщение Anonymous
-