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

Поиск по массиву в compile time на С

В стандарте то стандарте, но не совсем "С", точнее совсем не "С". C++11 это.

Ну с связи с возможностью удобной интеграции GCC в MS VS посредством VisualGDB я пересел полностью на GCC, для которого и С ++ 11 совсем не новинка. Если поджимают ресурсы - не пользую stl, new и подобное просто, а сами по себе плюсы ничего не кушают, даже виртуальные методы - точно также делались в голом С, посредством таблиц и передачей в функции явного this, так что ничего не теряю с плюсами это точно

 

 

Почему они так написали - понятно, пишут так что бы их поняли без буквоедства, но кмк тут они переборщили с обобщением. В стандарте следующее:

 

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

это как раз в Сях, без спецификации underlying типа. А Никсон как раз описал возможность в С11 явно указать этот тип, причем в такой форме это не возможность, а обязанность.

PS :laughing: я таки с вашими новыми знаниями добил майкрософтовский компилер!!

post-5493-1534230880_thumb.png

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


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

это как раз в Сях, без спецификации underlying типа.

Это цитата из ISO/IEC JTC1 SC22 WG21 N3690 Date: 2013-05-15 7.2 Enumeration declarations

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


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

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, с учетом того что ГЦЦ привел энум к чару

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


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

А что тут не так с sizeof (tst) ? Он 4 стал равен, хотя все остальное по 1, с учетом того что ГЦЦ привел энум к чару

А чего вы хотите добиться применяя sizeof к значению?

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


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

А чего вы хотите добиться применяя sizeof к значению?

Просто понять почему он в структуре один, а вот так просто -4

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


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

После sizeof ( некого enum ), недалеко и до sizeof ( #define чего-то ) ... :)

А все же, почему так?

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


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

А все же, почему так?

Да кто его ж знает, компилятор этот ...

 

Вот тут немножко есть про это: https://stackoverflow.com/questions/8115550...-type-data-in-c

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


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

Извиняюсь, если это уже предлагали(не читал все сообщения)

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.

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


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

Просто понять почему он в структуре один, а вот так просто -4

Как это значение может быть в структуре? Это просто число, оно нигде, пока вы его куда-то не положите. А если положили то и sizeof нужно применять к месту куда положили.

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


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

Как это значение может быть в структуре? Это просто число, оно нигде, пока вы его куда-то не положите. А если положили то и sizeof нужно применять к месту куда положили.

А где Вы видите значение в структуре? Перечисление - это такой же тип, как, например, структура. Только поля перечислений могут использоваться без имени самого перечисления.

Например,

typedef enum
{
    OK = 0,
    ERR
}TEnum;

дает возможность объявлять переменные перечислимого типа:

TEnum my_var; // my_var - это теперь int или char в зависимости от реализации компилятора

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


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

Я не вижу. Вопрос был DASM'у цитата к которой вопрос в моем посте до вопроса. Посмотрите внимательно на код DASM, с которого началось обсуждение.

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


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

Как это значение может быть в структуре? Это просто число, оно нигде, пока вы его куда-то не положите. А если положили то и sizeof нужно применять к месту куда положили.

offsetof считает смещения поля в структуре. Видно, что оно увеличивается на один после такого энум поля.

Что вам непонятно? Почему компилятор, выделяя место для поля типа энум - отводит на это 1 байт, но sizeof применительно к элементу этого энум дает 4.

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


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

offsetof считает смещения поля в структуре. Видно, что оно увеличивается на один после такого энум поля.

Что вам непонятно? Почему компилятор, выделяя место для поля типа энум - отводит на это 1 байт, но sizeof применительно к элементу этого энум дает 4.

Вставил как есть ваш код в компилятор ARM (keil), в двух версиях: v5.06 и v6.10.1, вышло sizeof(tst) = 1 ... Все норм.

По-ходу ваш компилятор такой ... странный :cranky:

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


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

Применительно к этой ситуации, как раз Кейл - неправильно делает, но полезным для эмбедеда способом.

Почему компилятор, выделяя место для поля типа энум - отводит на это 1 байт, но sizeof применительно к элементу этого энум дает 4.

Если это вопрос, то потому что sizeof принимает либо тип, либо выражение. Т.к. это выражение, то число-значение энума, автоматом в выражении приводится к int. И sizeof соответственно отдает размер инта.

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


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

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

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

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

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

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

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

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

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

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