Перейти к содержанию
    

Error[Pe070]: incomplete type is not allowed

Есть код. Из  библиотеки LPCOpen. Ничего не трогал.

typedef ATTR_IAR_PACKED struct
            {
                USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */

                uint16_t UnicodeString[]; /**< String data, as unicode characters (alternatively,
                                           *   string language IDs). If normal ASCII characters are
                                           *   to be used, they must be added as an array of characters
                                           *   rather than a normal C string so that they are widened to
                                           *   Unicode size.
                                           *
                                           *   Under GCC, strings prefixed with the "L" character (before
                                           *   the opening string quotation mark) are considered to be
                                           *   Unicode strings, and may be used instead of an explicit
                                           *   array of ASCII characters on little endian devices with
                                           *   UTF-16-LE \c wchar_t encoding.
                                           */
            } ATTR_PACKED USB_Descriptor_String_t;

При компиляции выдаёт ошибку Error[Pe070]: incomplete type is not allowed.

Я понимаю, что массив не определенной длины, но как догда это понимать ??

ATTR_IAR_PACKED = __packed

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 минут назад, yuryhor сказал:

Я понимаю, что массив не определенной длины,

В языке C массивы неопределенной длины в конце структуры допускаются. В плюсах - нет. Если вы хотите эту библиотеку использовать в плюсах - вам придется ее трогать. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за подсказку.

Да в опциях компилятора значится С++.

хотя весь файл обернут extern "C"{}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 минуты назад, yuryhor сказал:

хотя весь файл обернут extern "C"{}

Тогда пишите создателям файла - пусть "или трусы наденут, или крестик снимут".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, yuryhor сказал:

При компиляции выдаёт ошибку Error[Pe070]: incomplete type is not allowed.

Вангую, что USB_Descriptor_Header_t не была объявлена ДО typedef ATTR_IAR_PACKED struct.

 

1 час назад, Сергей Борщ сказал:

В языке C массивы неопределенной длины в конце структуры допускаются. В плюсах - нет. Если вы хотите эту библиотеку использовать в плюсах - вам придется ее трогать. 

Не знаю в каких плюсах не допускаются, но IAR 7.80.4 вполне себе нормально прожёвывает следующее:

struct USB_Descriptor_Header_t { u8 z; };
__root __packed struct {
  USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */
  u16 UnicodeString[];
} z1;

Language: C++.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 минут назад, jcxz сказал:

Не знаю в каких плюсах не допускаются

В тех, которые соблюдают Стандарт.

Цитата

A class that has been declared but not defined, or an array of unknown size or of incomplete element type,
is an incompletely-defined object type.38) Incompletely-defined object types and the void types are incomplete
types (3.9.1). Objects shall not be defined to have an incomplete type.

 

17 минут назад, jcxz сказал:

но IAR 7.80.4 вполне себе нормально прожёвывает

На ИАРе свет клином не сошелся.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 минут назад, Сергей Борщ сказал:

В тех, которые соблюдают Стандарт.

Сомневаюсь что IAR его не соблюдает. В стандартах лазить мне лень...  :unknw:

8 минут назад, Сергей Борщ сказал:

На ИАРе свет клином не сошелся.

Судя по косвенным признакам, у ТС-а именно IAR.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, jcxz сказал:

Сомневаюсь что IAR его не соблюдает.

Я вам привел цитату из Стандарта. Вы уверждаете, что ИАР этот код ест. Ах да, я снова забыл: ваше мнение и ваш компилятор самые правильные...

1 час назад, jcxz сказал:

В стандартах лазить мне лень...

Тогда читайте документацию на ИАР. Помнится, там был раздел "отклонения от стандарта".

 

В порядке гуманитарной помощи:

using namespace usb::descriptor;

#define STRING_DESCRIPTOR(name, text)                   \
struct string_descriptor_##name                         \
{                                                       \
    header      Header;                                 \
    char16_t    Text[sizeof(text)/ sizeof(text[0])];    \
} __attribute__((__packed__))const name =               \
{                                                       \
    /* do not transfer trailing null char */            \
    { sizeof(name) - sizeof(char16_t), type::STRING },  \
    text                                                \
}

STRING_DESCRIPTOR(Language, u"\x0409");
STRING_DESCRIPTOR(Device_name, u"device name");

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, yuryhor said:

хотя весь файл обернут extern "C"{}

extern "C" - это не про типы, а про функции. То есть эта примочка помочь никак не сможет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 минут назад, scifi сказал:

extern "C" - это не про типы, а про функции

Но она как бы даже не намекакет, а явно говорит, что автор предполагал использование этого файла в плюсовых программах.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

40 минут назад, Сергей Борщ сказал:

Я вам привел цитату из Стандарта. Вы уверждаете, что ИАР этот код ест. Ах да, я снова забыл: ваше мнение и ваш компилятор самые правильные...

Причём тут стандарт, причём тут какие-то ваши личные обиды на меня???  ТС задал конкретный вопрос: "Данный текст не компилируется, выдаёт ошибку". Я ответил конкретно на этот вопрос, не разводя ненужных здесь рассуждений о каких-то стандартах или фазах луны.

 

PS: И да: мой компилятор - самый правильный, если речь идёт об ответе на вопрос "Компилируется в нём, что-то или нет".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, jcxz сказал:

Причём тут стандарт,

Перечитайте, на что вы отвечали - поймете. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 08.05.2019 в 15:55, Сергей Борщ сказал:

В порядке гуманитарной помощи:

Два байта с каждого дескриптора коту под хвост :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, VladislavS сказал:

Два байта с каждого дескриптора коту под хвост :)

Зато строки выглядят как человеческие строки, а не массив кракозябр плюс рассчитанная вручную длина..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да я же шучу.  Конечно же, так правильнее. Порой и гораздо большую цену за удобства платить приходится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...