Aracılığıyla paylaş


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, __int32veya __int64biçimlerini intbelirtebilirsiniz. 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);
}

Çıkış

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");
}

Çıkış

a and day2 are the same

İşleçler ve sabit listeleri

Aşağıdaki işleçler C++/CLI'daki sabit listelerinde geçerlidir:

İşleç
== != < > <= >=
+ -
| ^ & ~
++ --
sizeof

, , ^, &, ~, ++ve -- işleçleri|, dahil booldeğ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.

Dekont

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

Ayrıca bkz.

enum class