Просмотр полной версии : [Вопрос] 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]));
}
В данном случае, у тебя в энуме находятся константы, а константа не может иметь размера. Поэтому, юзай вариант от totes.bild.
Так же, если что, вычислить "размер" члена перечисления можно так:
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) за использование массива).
Такой подход сработает только если знаешь, в каком порядке расположены элементы перечисления. Если же, к прмеру, добавить в конце SOME_ENUM новый элемент, то вычисление размера для any_element сломается.
Это понятно. Я потому и написал, что особого применения такому способу не вижу. Это, скорее, как наглядная демонстрация того, что все члены перечисления вычисляются друг из друга (криво сформулировал, но, думаю, будет понятно о чём я).
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot