LINUX.ORG.RU

С и enum

 ,


1

1

Есть следующий код:

#include <stdio.h>

typedef enum _pizza {
                        S_SMALL,
                        S_MEDIUM,
                        S_LARGE,
                    }pizza;

int main()
{
    pizza my_pizza;
    my_pizza = S_SMALL;
    printf("My pizza is %d\n", my_pizza);
    my_pizza = -100;
    printf("My pizza is %d\n", my_pizza);
    return 0;
}

./test_enum 
My pizza is 0
My pizza is -100

Компилятор спокойно пропускает и программа работает. Я ожидал, что при присвоении my_pizza значения не из enum _pizza будет уж если не ошибка, так предупреждение (если не ошибаюсь, Java такого не пропустит). Можно что-то с этим сделать? Может какие флаги компилятора есть, чтобы отслеживать?

По сути my_pizza это обычный int, так что всё нормально.

xterro ★★★★★
()

Все нижеотписавшиеся скажут тебя читать K&R.

Я добавлю, что enum == int, поэтому такие присвоения допустимы.

bk_ ★★
()

С++ за такое даст по рукам.

staseg ★★★★★
()

если не ошибаюсь, Java такого не пропустит

Нашёл, что сравнивать: C и Java. Сравнивал бы уже Java с C++11, в котором enum'ы значительно изменились (например, есть enum class).

gentoo_root ★★★★★
()
Ответ на: комментарий от bk_

Да, видимо такие «вольности» только pure C позволяет. C++, Java, C# таки «дают по рукам» (хотя в С++ можно явно сделать cast и все будет ок).

GreenBag ★★
() автор топика
Ответ на: комментарий от gentoo_root

Согласен, что вещи несравнимы — каждая хороша для своих типов задач. Но я же не о gc и прочих «алмазных операторах» говорю. Хотелось больше контроля для enum, которому уже сто лет от роду. Видимо, не судьба.

GreenBag ★★
() автор топика
Ответ на: комментарий от Harald

Дык привык уже, что «modern» ЯВУ хлещут за всякие отклонения влево-вправо. А тут надо работать с суровым языком Чака Норриса.

GreenBag ★★
() автор топика

Присваивая значения левых типов, делай явный каст и подписывай каментом: «Этот парашют складывал я сам» :)

Xenesz ★★★★
()

Вот странный человек! Присвоил int'у значение int и удивляется, почему ругани нет!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Xenesz

Это в плюсах так. Тут парашютист обнаружит, что мои кривые руки его складывали уже после того, как покинет самолёт (:

GreenBag ★★
() автор топика
Ответ на: комментарий от GreenBag

Так каст не для полной безопасности, а для того, чтобы укладка при прыжке в люк пролезла :) и чтобы потенциальные подлянки без дебаггера видеть.

Xenesz ★★★★
()
typedef enum _pizza {
                        S_SMALL = 1,
                        S_MEDIUM,
                        S_LARGE,
                    }pizza;

ttnl ★★★★★
()
Ответ на: комментарий от Gorthauer

Оно и необязательно int, что компилятор посчитает наиболее удобным, то он и подставит в качестве типа.

А ты указывай -fshort-enums - копилятор и не «подставит»

anonymous
()
Ответ на: комментарий от anonymous
 -fshort-enums
           Allocate to an «enum» type only as many bytes as it needs for the declared range of possible values.
           Specifically, the «enum» type will be equivalent to the smallest integer type which has enough room.

           Warning: the -fshort-enums switch causes GCC to generate code that is not binary compatible with code
           generated without that switch.  Use it to conform to a non-default application binary interface.

По-моему не совсем то. Он просто выделит минимум памяти под enum, но не запретит присваивания «левого» значения (при этом флаге выдает 156 вместо 100)

GreenBag ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.