LINUX.ORG.RU

глупый вопрос по ABI

 ,


2

2

Есть интерфейс плагина, например:

class Embeddable
{
public:
    enum { TypeA, TypeB, TypeC };

    virtual void embed() = 0;
};

Если в будущем я добавлю новые энумераторы в enum, то сломается ли ABI данного класса? И если сломается, то единственный выход - это сделать сейчас

enum { TypeA, TypeB, TypeC, Reserved1, Reserved2, Reserved3 };

?

★★★

Последнее исправление: former_anonymous (всего исправлений: 1)

Может сломается а может и нет, но чтобы его сломать, нужно вылезти за пределы int хотя-бы. Чтобы не ломалось нужно C++11 и enum : int {}

Gorthauer ★★★★★
()

Сломается только код, который делал switch без блока default и корректной проверки случая, когда enum не попадает ни под одно из проверяемых значений.

quiet_readonly ★★★★
()
Ответ на: комментарий от no-such-file

В Си эти константы имеют тип int обязательно. В Си++ они могут иметь любой подходящий целочисленный тип. Если добавить новые константы, то энумы, которые были чарами, внезапно станут интами. Если там был какой-то хитрожопый код, который считал, что данные энумы это именно чары с размером в байтик, то ему это может не понравиться. Но это надо быть особым извращенцем, чтобы такой код писать.

ilammy ★★★
()

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

P.S. Не забудь про

enum{
      TypeA
    , TypeB
    ....
    , UserFirstValue = 1000
}

Чтобы оставить и для себя зарезервированное место под расширение, и пользователя необидеть в возможностях расширять enum. (Такой способ я у qt-шников подсмотрел).

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

Сломается только код, который делал switch без блока default

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

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

7.2/5.

В C++03 любой тип, в который всё влазит, но не больше, чем int.

В С++11 по умолчанию int, если не указать явный тип.

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

Чтобы оставить и для себя зарезервированное место под расширение

Это не подойдёт, в Qt можно создавать свои номера событий, но обрабатывает эти номера сам клиент, а Qt хранит только числовой номер. У меня же хост программа должна знать заранее все возможные типы плагинов, чтобы загружать именно те, которые нужно.

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

В Си++ они могут иметь любой подходящий целочисленный тип

Могут, но не обязаны. Чё-то мне не верится что компилятор будет использовать char на 32битной архитектуре.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Чё-то мне не верится что компилятор будет использовать char на 32битной архитектуре.

-fshort-enums ;) Ну и C на пару с C++ не те языки, где можно полагаться на здравый смысл, не подкреплённый явно текстом стандарта.

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