Oleg_IT 0 30 августа, 2013 Опубликовано 30 августа, 2013 · Жалоба Переношу код из AVR Studio (WINAVR) в Keil. Компилятор выдаёт предупреждение на объявление, на стоку с "};" ……… struct { unsigned char Bit1 : 1; unsigned char Bit2 : 1; }; …………. ..\Test.h(37): warning: #40-D: expected an identifier И потом выдаёт ошибку на использование этих полей. Лечится это заданием имени структуры, например "} A1;", что не удобно, для меня. В WINAVR, в MinGW, в Visual Studio такого нет, только в Keil. Может быть это стандарт С++, не проверял и всех тонкостей языка не знаю. Можно какими-нибудь флажками убрать эту особенность? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shmur 0 30 августа, 2013 Опубликовано 30 августа, 2013 · Жалоба Приведите весь код, а то не понятно это внутри структуры, юниона или просто чистое объявление. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
psL 0 30 августа, 2013 Опубликовано 30 августа, 2013 · Жалоба компилятору непонятно, как вы собираетесь использовать эту анонимную структуру в дальнейшем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gvg 0 30 августа, 2013 Опубликовано 30 августа, 2013 · Жалоба можно попробовать так: struct { unsigned char Bit1_ : 1; unsigned char Bit2_ : 1; } A1; #define Bit1 A1.Bit1_ #define Bit2 A1.Bit2_ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VAI 0 30 августа, 2013 Опубликовано 30 августа, 2013 · Жалоба Для анонимных структур существует #pragma anon_unions. Почитать можно в файле "....\Keil\ARM\Hlp\armcc.chm" или здесь http://www.keil.com/support/man/docs/armcc...ef_BCFBCFBF.htm или здесь http://infocenter.arm.com/help/index.jsp?t...c/BCFBCFBF.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 16 30 августа, 2013 Опубликовано 30 августа, 2013 · Жалоба Что-то я не понимаю, как эту структуру безымянную использовать. enum - другое дело. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A. Fig Lee 0 30 августа, 2013 Опубликовано 30 августа, 2013 · Жалоба typedef struct { unsigned char Bit1 : 1; unsigned char Bit2 : 1; } tStruct; tStruct str1; tStruct str2; void func1() { str1.Bit1 = 0; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shmur 0 30 августа, 2013 Опубликовано 30 августа, 2013 · Жалоба Возможно у топик стартера было что -то вроде: union uu { struct { unsigned char Bit1 : 1; unsigned char Bit2 : 1; }; int v; }; Но некоторые компиляторы не позволяют использовать безымянные структуры, возможно Кейл как раз один из таких компиляторов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vassabi 0 30 августа, 2013 Опубликовано 30 августа, 2013 · Жалоба Может я что-то не понимаю, но как вы в битовое поле длиной один бит хотите воткнуть char, т.е. 8 бит? Согласно справочника по С, битовое поле может быть signed или unsigned. Если вы хотите unsigned char, то наверное нужно хотябы длинну поля указать :8... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A. Fig Lee 0 30 августа, 2013 Опубликовано 30 августа, 2013 · Жалоба Может я что-то не понимаю, но как вы в битовое поле длиной один бит хотите воткнуть char, т.е. 8 бит? Согласно справочника по С, битовое поле может быть signed или unsigned. Если вы хотите unsigned char, то наверное нужно хотябы длинну поля указать :8... Кто хочет? Я? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 4 30 августа, 2013 Опубликовано 30 августа, 2013 · Жалоба Может я что-то не понимаю, но как вы в битовое поле длиной один бит хотите воткнуть char, т.е. 8 бит? Согласно справочника по С, битовое поле может быть signed или unsigned. Если вы хотите unsigned char, то наверное нужно хотябы длинну поля указать :8... Я правильно понял, что в Вашей версии С невозможны поля длиной меньше 8 бит? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vassabi 0 30 августа, 2013 Опубликовано 30 августа, 2013 · Жалоба Я правильно понял, что в Вашей версии С невозможны поля длиной меньше 8 бит? Не правильно. Читайте внимательно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 6 30 августа, 2013 Опубликовано 30 августа, 2013 · Жалоба Согласно справочника по С, битовое поле может быть signed или unsigned. Согласно стандарта: A bit-field shall have a type that is a qualified or unqualified version of _Bool, signed int, unsigned int, or some other implementation-defined type. Транслятор Keil в данном случае считает тип signed/unsigned char как "other implementation-defined type". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KnightIgor 2 30 августа, 2013 Опубликовано 30 августа, 2013 · Жалоба Компилятор выдаёт предупреждение на объявление, на стоку с "};" ……… struct { unsigned char Bit1 : 1; unsigned char Bit2 : 1; }; …………. ..\Test.h(37): warning: #40-D: expected an identifier ……… struct mystruct_s { unsigned char Bit1 : 1; unsigned char Bit2 : 1; }; ... struct mystruct_s variable_a, variable_b; ... variable_a.Bit1 = variable_b.Bit2; …………. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Oleg_IT 0 1 сентября, 2013 Опубликовано 1 сентября, 2013 · Жалоба Приведите весь код, а то не понятно это внутри структуры, юниона или просто чистое объявление. Это заголовок IP typedef struct IP_Head_v4_tag { struct { unsigned char IHL : 4; // IHL - 5 unsigned char Version : 4; // Version - 4 }; struct { unsigned char Prec : 3; // Precedence - 3 unsigned char D : 1; // Delay Normal - 0 unsigned char T : 1; // Throughput Normal - 0 unsigned char R : 1; // Relibility Normal - 0 unsigned char Res1 : 2; // Reserved - 00 }; unsigned short TotalLen; // Total Length unsigned short Identif; // Идентификатор - 0 struct { unsigned short FragOffset: 13; // Fragment Offset - 0 unsigned char MF : 1; // Fragment - 0 = Last Fragment unsigned char DF : 1; // Fragment - 1 = Don't Fragment unsigned char Res2 : 1; // Reserved - 0 }; struct { unsigned char TTL : 8; // Time to Live < 1 unsigned char Prot : 8; // Protocol }; unsigned short Checksum; // Header Checksum IPADDRESS IP_SRC_Adr; // Source Address IPADDRESS IP_DST_Adr; // Destination Address } IP_Head_v4; Со всеми перечисленными компиляторами (WINAVR, MinGW, Visual Studio) анонимные битовые поля структур работают правильно. Для анонимных структур существует #pragma anon_unions. Спасибо, проверю, а вдруг поможет. Что-то я не понимаю, как эту структуру безымянную использовать. Например так IP_Head_v4 IP_H; IP_H.IHL = 5; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться