Delphi аналог перечисления C ++? - PullRequest
0 голосов
/ 16 января 2020

Имеет ли язык Delphi аналог такого перечисления из c ++

enum EnumOfUChars : unsigned char {
    EnumValue1 = 0x10,
    EnumValue2 = 0x20
}

ОБНОВЛЕНИЕ:
Я знаю о перечислениях в delphi, вопрос - возможно ли иметь перечисление со значениями, не int, но без знака char?

enum EnumOfInt {
    IntValue = 0x10
};

enum EnumOfUChars : unsigned char {
    UCharValue = 0x10
};

int main()
{
    printf("Size of IntValue %ld\n" , sizeof(IntValue));
    printf("Size of UCharValue %ld\n" , sizeof(UCharValue));

    return 0;
}

Вывод:

Size of IntValue 4
Size of UCharValue 1

Ответы [ 2 ]

3 голосов
/ 16 января 2020

Да, это так. Вышеупомянутый тип в Delphi будет

TYPE
  EnumOfUChars = (EnumValue1 = $10, EnumValue2 = $20);

Однако, где перечисления в C ++ являются просто псевдонимами для значений int, они являются различными типами в Delphi. Другими словами, тогда как в C ++ вы можете сделать:

int c = EnumValue1;

, вы не можете сделать это - напрямую - в Delphi. Вышеприведенное должно быть определено как

VAR C : INTEGER = ORD(EnumValue1);

, где "ORD" является Delphi эквивалентом (но не идентичным) типа int в C ++.

Аналогично, противоположное направление :

C++: EnumOfUChars E = 0x22;

Это невозможно сделать (не нарушая тип enum) в Delphi, так как значение $ 22 не является допустимым значением enum. Тем не менее, вы можете принудительно выполнить это:

Delphi: VAR E : EnumOfUChars = EnumOfUChars($22);

Если вы хотите использовать двоичные значения для перечислений в Delphi (что будет предлагаться в приведенном выше определении), вам нужно будет сделать это с помощью SET OF EnumOfUChars, как в:

C++ : EnumOfUChars C = EnumValue1 | EnumValue2;

Delphi: VAR C : SET OF EnumOfUChars = [EnumValue1,EnumValue2];

и для проверки:

C++ : if (C & EnumValue1)...

Delphi: IF EnumValue1 IN C THEN...

Таким образом, вы можете выполнить sh то же самое в Delphi относительно перечислений, но способ вы делаете это иначе, чем в C ++.

1 голос
/ 16 января 2020

В зависимости от того, что вам нужно, вы можете сбросить enum и просто сделать это так:

type
  EnumOfUChars = Byte;
const
  EnumValue1 = $10;
  EnumValue2 = $20;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...