PDA

Просмотр полной версии : [Вопрос] sizeof элемента в enum



nitecore
06.04.2021, 20:01
Привет всем еще раз.

Можно ли узнать размер какого-либо элемента из enum?

Например:

enum SOME_ENUM
{
some_element[128],
any_element[64]
}

как узнать размеры some_element и any_element?

Shaolinka
06.04.2021, 20:16
printf("%d, %d", sizeof SOME_ENUM:some_element, sizeof SOME_ENUM:any_element);

?

nitecore
06.04.2021, 20:20
printf("%d, %d", sizeof SOME_ENUM:some_element, sizeof SOME_ENUM:any_element);

?


[ ERROR ] Line 11: invalid symbol name "SOME_ENUM"
[WARNING] Line 11: expression has no effect
[ ERROR ] Line 11: invalid symbol name "SOME_ENUM"
[WARNING] Line 11: expression has no effect
[ ERROR ] Line 11: expected token: ";", but found ")"
[ FATAL ] Line 11: too many error messages on one line

Shaolinka
06.04.2021, 23:20
[ ERROR ] Line 11: invalid symbol name "SOME_ENUM"
[WARNING] Line 11: expression has no effect
[ ERROR ] Line 11: invalid symbol name "SOME_ENUM"
[WARNING] Line 11: expression has no effect
[ ERROR ] Line 11: expected token: ";", but found ")"
[ FATAL ] Line 11: too many error messages on one line


printf("%d, %d", sizeof _:some_element, sizeof _:any_element);

nitecore
06.04.2021, 23:23
printf("%d, %d", sizeof _:some_element, sizeof _:any_element);


[ ERROR ] Line 9: invalid symbol name "_"
[WARNING] Line 9: expression has no effect
[ ERROR ] Line 9: invalid symbol name "_"
[WARNING] Line 9: expression has no effect
[ ERROR ] Line 9: expected token: ";", but found ")"
[ FATAL ] Line 9: too many error messages on one line

totes.bild
07.04.2021, 00:37
enum SomeEnum
{
FirstConst[100],
SecondConst[150]
// other constants..
};

new someVar[SomeEnum];

main()
{
// output: 100, 150
printf("%i, %i", sizeof(someVar[FirstConst]), sizeof(someVar[SecondConst]));
}

Pa4enka
07.04.2021, 01:31
В данном случае, у тебя в энуме находятся константы, а константа не может иметь размера. Поэтому, юзай вариант от totes.bild.

DeimoS
07.04.2021, 05:07
Так же, если что, вычислить "размер" члена перечисления можно так:

enum SOME_ENUM
{
some_element[128],
any_element[64]
}

main()
{
printf("some_element: %i", _:any_element-_:some_element);
printf("any_element: %i", _:SOME_ENUM-_:any_element);
}

Хотя не знаю где конкретно этот метод может пригодиться в коде.

Daniel_Cortez
08.04.2021, 18:08
Так же, если что, вычислить "размер" члена перечисления можно так:

enum SOME_ENUM
{
some_element[128],
any_element[64]
}

main()
{
printf("some_element: %i", _:any_element-_:some_element);
printf("any_element: %i", _:SOME_ENUM-_:any_element);
}
Такой подход сработает только если знаешь, в каком порядке расположены элементы перечисления. Если же, к прмеру, добавить в конце SOME_ENUM новый элемент, то вычисление размера для any_element сломается.

В целом, согласен с вариантом totes.bild, с той лишь оговоркой, что массив someVar стоило объявить с помощью ключевого слова stock, чтобы избежать варнинга, если этот массив больше нигде не используется (да, компилятор не считает sizeof(someVar) за использование массива).

DeimoS
09.04.2021, 00:20
Такой подход сработает только если знаешь, в каком порядке расположены элементы перечисления. Если же, к прмеру, добавить в конце SOME_ENUM новый элемент, то вычисление размера для any_element сломается.

Это понятно. Я потому и написал, что особого применения такому способу не вижу. Это, скорее, как наглядная демонстрация того, что все члены перечисления вычисляются друг из друга (криво сформулировал, но, думаю, будет понятно о чём я).