конфликтный тип данных quint16_be из QtEndian с помощью stdint.h

#c #windows #qt5

#c #Windows #qt5

Вопрос:

Я хочу использовать qint16_be, quint16_be, quint32_be и т. Д. В качестве типа данных для big endian, что я пытаюсь, это что-то вроде этого

 #include <QtEndian>
typedef quint16_be uint16_t;
 

И я получаю сообщение об ошибке

 C:/Qt/5.15.2/mingw81_64/include/QtCore/qendian.h:429:28: error: conflicting declaration 'typedef QBEInteger<short int> qint16_be'
 typedef QBEInteger<qint16> qint16_be;
 C:/Qt/Tools/mingw810_64/x86_64-w64-mingw32/include/stdint.h:38:25: note: previous declaration as 'typedef short unsigned int qint16_be'
 typedef unsigned short  qint16_be;
 

Я не включил stdint.h в моем проекте.
Есть идеи, как мне это решить

Комментарии:

1. Определение typedef quint16_be uint16_t; может конфликтовать с uint16_t (определено stdint.h и принято в cstdint ). Это, по-моему, действительно плохая идея и, вероятно, причина вашей ошибки. Кстати. вы запускаете свой код на архитектуре с большим расширением? Вы когда-нибудь намеревались скомпилировать его везде?

2. typedef беззнаковое короткое qint16_be; Выглядит как-то странно. Разве это не должно быть quint16_be ? Опечатка?

3. Я не включил stdint. h в моем проекте. Вы нет, но как насчет Qt?

4. Для этого qToBigEndian и qFromBigEndian кажутся мне правильным выбором.

5. typedef Имхо, стоит только придать ему правильный размер. Тем не менее, мне это кажется немного странным. Я бы использовал шаблонный класс с перегруженным присваиванием, который допускает, что собственный конечный код заменяется в случае.

Ответ №1:

Вот так: MCVE для qToBigEndian():

 #include <QtCore>

int main()
{
  const uint16_t sample = 0x0201;
  QByteArray data((const char*)amp;sample, sizeof sample);
  qDebug() << data;
  const uint16_t sampleBE = qToBigEndian(sample);
  QByteArray dataBE((const char*)amp;sampleBE, sizeof sampleBE);
  qDebug() << dataBE;
}
 

Вывод:

 "x01x02"
"x02x01"
 

Я запустил этот образец в VS2019 на своем ноутбуке Intel, который имеет архитектуру little-endian.
Соответственно, порядок байтов был изменен из-за вызова qToBigEndian() .

Преобразование в QByteArray было быстрым взломом.
Тем не менее, преобразование const uint16_t* в const char* разрешено (с намерением получить доступ к байтовому представлению чего-либо).

memcpy() — еще один разрешенный способ добиться этого.

Комментарии:

1. Спасибо, Шефф, у меня есть идея. Но основная проблема по-прежнему остается. Если я включаю <QtEndian>, компилятор жалуется на конфликтующее объявление. это потому, что в stdint. h у нас есть typedef беззнаковое короткое qint16_be; в то время как в qtendian. h у нас есть typedef QBEInteger<qint16> qint16_be; где quint16 имеет тип typedef short qint16

2. в stdint. h я сомневаюсь, что у нас есть typedef беззнаковый короткий qint16_be . (Если он будет там, это не стандарт stdint.h или он сломан.)

3. Спасибо, Шефф. Именно там я бы углубился в это. Спасибо за информацию