DASM 0 14 августа, 2018 Опубликовано 14 августа, 2018 · Жалоба В стандарте то стандарте, но не совсем "С", точнее совсем не "С". C++11 это. Ну с связи с возможностью удобной интеграции GCC в MS VS посредством VisualGDB я пересел полностью на GCC, для которого и С ++ 11 совсем не новинка. Если поджимают ресурсы - не пользую stl, new и подобное просто, а сами по себе плюсы ничего не кушают, даже виртуальные методы - точно также делались в голом С, посредством таблиц и передачей в функции явного this, так что ничего не теряю с плюсами это точно Почему они так написали - понятно, пишут так что бы их поняли без буквоедства, но кмк тут они переборщили с обобщением. В стандарте следующее: Как я это понимаю - если оно врет одинаково для всех энумов с одним типом - это ок. И оно может, т.к. гарантий что энум будет размещен именно в том типе что указан, нет, только то что значения энума помещаются в данный тип. это как раз в Сях, без спецификации underlying типа. А Никсон как раз описал возможность в С11 явно указать этот тип, причем в такой форме это не возможность, а обязанность. PS :laughing: я таки с вашими новыми знаниями добил майкрософтовский компилер!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 14 августа, 2018 Опубликовано 14 августа, 2018 · Жалоба это как раз в Сях, без спецификации underlying типа. Это цитата из ISO/IEC JTC1 SC22 WG21 N3690 Date: 2013-05-15 7.2 Enumeration declarations Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DASM 0 16 августа, 2018 Опубликовано 16 августа, 2018 · Жалоба typedef enum { tst, tst2, tst3 } test; #pragma pack (1) typedef struct { test f; test g; test h; } lala; lala l; int t = sizeof(l.f); // = 1 OK int z = sizeof (lala); // = 3 OK int a = offsetof (lala, g);// = 1 OK int q = sizeof(tst); // = 4 WTF ?? #pragma pack () А что тут не так с sizeof (tst) ? Он 4 стал равен, хотя все остальное по 1, с учетом того что ГЦЦ привел энум к чару Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 16 августа, 2018 Опубликовано 16 августа, 2018 · Жалоба А что тут не так с sizeof (tst) ? Он 4 стал равен, хотя все остальное по 1, с учетом того что ГЦЦ привел энум к чару А чего вы хотите добиться применяя sizeof к значению? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DASM 0 16 августа, 2018 Опубликовано 16 августа, 2018 · Жалоба А чего вы хотите добиться применяя sizeof к значению? Просто понять почему он в структуре один, а вот так просто -4 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 16 августа, 2018 Опубликовано 16 августа, 2018 · Жалоба После sizeof ( некого enum ), недалеко и до sizeof ( #define чего-то ) ... :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DASM 0 16 августа, 2018 Опубликовано 16 августа, 2018 · Жалоба После sizeof ( некого enum ), недалеко и до sizeof ( #define чего-то ) ... :) А все же, почему так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 16 августа, 2018 Опубликовано 16 августа, 2018 · Жалоба А все же, почему так? Да кто его ж знает, компилятор этот ... Вот тут немножко есть про это: https://stackoverflow.com/questions/8115550...-type-data-in-c Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 17 августа, 2018 Опубликовано 17 августа, 2018 · Жалоба Извиняюсь, если это уже предлагали(не читал все сообщения) https://www.boost.org/doc/libs/1_67_0/libs/.../doc/index.html The library supports both C++ and C compilation. It does not depend on any other Boost libraries and therefore may be used as a standalone library. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 17 августа, 2018 Опубликовано 17 августа, 2018 · Жалоба Просто понять почему он в структуре один, а вот так просто -4 Как это значение может быть в структуре? Это просто число, оно нигде, пока вы его куда-то не положите. А если положили то и sizeof нужно применять к месту куда положили. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 17 августа, 2018 Опубликовано 17 августа, 2018 · Жалоба Как это значение может быть в структуре? Это просто число, оно нигде, пока вы его куда-то не положите. А если положили то и sizeof нужно применять к месту куда положили. А где Вы видите значение в структуре? Перечисление - это такой же тип, как, например, структура. Только поля перечислений могут использоваться без имени самого перечисления. Например, typedef enum { OK = 0, ERR }TEnum; дает возможность объявлять переменные перечислимого типа: TEnum my_var; // my_var - это теперь int или char в зависимости от реализации компилятора Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 17 августа, 2018 Опубликовано 17 августа, 2018 · Жалоба Я не вижу. Вопрос был DASM'у цитата к которой вопрос в моем посте до вопроса. Посмотрите внимательно на код DASM, с которого началось обсуждение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DASM 0 17 августа, 2018 Опубликовано 17 августа, 2018 · Жалоба Как это значение может быть в структуре? Это просто число, оно нигде, пока вы его куда-то не положите. А если положили то и sizeof нужно применять к месту куда положили. offsetof считает смещения поля в структуре. Видно, что оно увеличивается на один после такого энум поля. Что вам непонятно? Почему компилятор, выделяя место для поля типа энум - отводит на это 1 байт, но sizeof применительно к элементу этого энум дает 4. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 17 августа, 2018 Опубликовано 17 августа, 2018 · Жалоба offsetof считает смещения поля в структуре. Видно, что оно увеличивается на один после такого энум поля. Что вам непонятно? Почему компилятор, выделяя место для поля типа энум - отводит на это 1 байт, но sizeof применительно к элементу этого энум дает 4. Вставил как есть ваш код в компилятор ARM (keil), в двух версиях: v5.06 и v6.10.1, вышло sizeof(tst) = 1 ... Все норм. По-ходу ваш компилятор такой ... странный :cranky: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 17 августа, 2018 Опубликовано 17 августа, 2018 · Жалоба Применительно к этой ситуации, как раз Кейл - неправильно делает, но полезным для эмбедеда способом. Почему компилятор, выделяя место для поля типа энум - отводит на это 1 байт, но sizeof применительно к элементу этого энум дает 4. Если это вопрос, то потому что sizeof принимает либо тип, либо выражение. Т.к. это выражение, то число-значение энума, автоматом в выражении приводится к int. И sizeof соответственно отдает размер инта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться