Nasıl yapılır: C++/CLI üzerinde numaralandırmaları tanımlama ve kullanma
C++/CLI'daki numaralandırma türlerinin, standart C++ içindeki numaralandırma türleriyle bazı farklılıkları vardır. Bu makalede, C++/CLI numaralandırma türlerinin nasıl kullanılacağı ve standart sabit listesi türleriyle birlikte çalışma açıklanmaktadır.
Bir öğesinin temel türünü belirtme enum
Varsayılan olarak, bir numaralandırmanın temel türü şeklindedir int
. Ancak, imzalanacak türü veya imzalanmamış , short
, long
, __int32
veya __int64
biçimlerini int
belirtebilirsiniz. komutunu da kullanabilirsiniz char
.
// mcppv2_enum_3.cpp
// compile with: /clr
public enum class day_char : char {sun, mon, tue, wed, thu, fri, sat};
int main() {
// fully qualified names, enumerator not injected into scope
day_char d = day_char::sun, e = day_char::mon;
System::Console::WriteLine(d);
char f = (char)d;
System::Console::WriteLine(f);
f = (char)e;
System::Console::WriteLine(f);
e = day_char::tue;
f = (char)e;
System::Console::WriteLine(f);
}
Çıktı
sun
0
1
2
Yönetilen ve standart sabit listeleri arasında dönüştürme
Sabit listesi ve tam sayı türü arasında standart dönüştürme yoktur; bir atama gereklidir.
// mcppv2_enum_4.cpp
// compile with: /clr
enum class day {sun, mon, tue, wed, thu, fri, sat};
enum {sun, mon, tue, wed, thu, fri, sat} day2; // unnamed std enum
int main() {
day a = day::sun;
day2 = sun;
if ((int)a == day2)
// or...
// if (a == (day)day2)
System::Console::WriteLine("a and day2 are the same");
else
System::Console::WriteLine("a and day2 are not the same");
}
Çıktı
a and day2 are the same
İşleçler ve sabit listeleri
Aşağıdaki işleçler C++/CLI'daki sabit listelerinde geçerlidir:
Operatör |
---|
== != < > <= >= |
+ - |
| ^ & ~ |
++ -- |
sizeof |
, , ^
, &
, ~
, ++
ve --
işleçleri|
, dahil bool
değil, yalnızca temel alınan tamsayı türlerine sahip numaralandırmalar için tanımlanır. her iki işlenen de sabit listesi türünde olmalıdır.
Derleyici bir sabit listesi işleminin sonucunu statik veya dinamik olarak denetlemez; bir işlem, numaralandırmanın geçerli numaralandırıcılarının aralığında olmayan bir değerle sonuçlanabilir.
Not
C++11, yönetilmeyen koddaki türleri tanıtır enum class
ve bu türler C++/CLI'daki yönetilen enum class
türlerden önemli ölçüde farklıdır. Özellikle, C++11 enum class
türü C++/CLI'daki yönetilen enum class
türle aynı işleçleri desteklemez ve C++/CLI kaynak kodunun yönetilmeyen (C++11) enum class
bildirimlerinden ayırt etmek için yönetilen enum class
bildirimlerde bir erişilebilirlik tanımlayıcısı sağlaması gerekir. C++/CLI, C++/CX ve C++11'de kullanım hakkında enum class
daha fazla bilgi için bkz enum class
. .
// mcppv2_enum_5.cpp
// compile with: /clr
private enum class E { a, b } e, mask;
int main() {
if ( e & mask ) // C2451 no E->bool conversion
;
if ( ( e & mask ) != 0 ) // C3063 no operator!= (E, int)
;
if ( ( e & mask ) != E() ) // OK
;
}
ve enum class
değerlerini ayırt enum
etmek için kapsam niteleyicilerini kullanın:
// mcppv2_enum_6.cpp
// compile with: /clr
private enum class day : int {sun, mon};
enum : bool {sun = true, mon = false} day2;
int main() {
day a = day::sun, b = day::mon;
day2 = sun;
System::Console::WriteLine(sizeof(a));
System::Console::WriteLine(sizeof(day2));
a++;
System::Console::WriteLine(a == b);
}
Çıktı
4
1
True