У меня есть программа, которая отображает регистрации устройств в союзах битфилд и целых числа. Это часть более крупной кодовой базы, поэтому, хотя это очень код 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++
Программы на C++. Форум разработчиков
1749751763
Anonymous
У меня есть программа, которая отображает регистрации устройств в союзах битфилд и целых числа. Это часть более крупной кодовой базы, поэтому, хотя это очень код 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;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79663940/implicit-conversion-from-int-to-union-works-in-designated-initializer-but-otherw[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия