Могу ли я использовать `enum class` в качестве типа аргумента функции на границе DLL?

0

Я получил класс enum под названием Animal в качестве ключа для поиска. Он определен в AnimalList.h

enum class Animal{Dog, Cat}; // v1

И я получил DLL AnimalInformation.dll с интерфейсом следующим образом:

HRESULT GetDescription(Animal animal_key, char* buffer, int& size_in_buffer);

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

AnimalList.h // v2

enum class Animal{Dog, Cat, Tiger, Lion};

Соответствует ли Animal{Dog, Cat, Tiger, Lion} Animal{Dog, Cat}?

Теги:
enums

1 ответ

0
Лучший ответ

Typechecking происходит во время компиляции, а определение имен, которое обеспечивает различные функции с разными типами, имеет разные имена, основанные на базовом типе и имени класса, поэтому должно давать одно и то же имя для обоих ваших примеров.

Однако вы должны бороться с тем, что GetDescription(Animal animal_key, char* buffer, int& size_in_buffer) не знает о Tiger и Lion и возвращает ERR_ANIMAL_UNKNOWN к пользовательскому коду, который пытается его использовать, если вы не согласны с ним DLL файлы. Что было бы не очень приятно. Это, конечно, проблема с ANY перечислением, и любая DLL, которая принимает данные пользователя, и определенные значения распознаются, а другие - нет.

  • 0
    Благодарю. Так что это нормально, чтобы поместить enum-класс на границе DLL, за исключением проблемы, что клиент может получить сообщение ERR_ANIMAL_UNKNOWN если он использует неправильную версию DLL?
  • 0
    Да, насколько я могу видеть. И это только проблема, если клиент (пользователь DLL) знает «больше» значений (конечно, если вы удалите значения, произойдут странные вещи, если только вы не исправите числовые значения с помощью enum class Animal { Dog=0, Cat=1, Tiger=2 } , тогда в будущем мы можем удалить Cat и при этом иметь те же значения).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню