Rozważmy ten mały struct:
struct foo
{
enum enum1
{
enum1_val1_ = 5,
enum1_val2_,
};
enum enum2
{
enum2_val1_ = 0x0001,
enum2_val2_ = 0x0010,
};
enum
{
// assume these come from complicated compile-time expressions
some_class_constant_ = 86,
another_one_ = 99,
};
};
Najszybszym sposobem jest użycie komendy dt
, za pomocą przełączników -r
(recurse, które trzeba wymienić członków enum
) i -v
(opisowy, co trzeba lista enum
y w ogóle):
0:000> dt -r -v foo
LangTestingD!foo
struct foo, 3 elements, 0x1 bytes
Enum enum1, 2 total enums
enum1_val1_ = 0n5
enum1_val2_ = 0n6
Enum enum2, 2 total enums
enum2_val1_ = 0n1
enum2_val2_ = 0n16
Enum <unnamed-tag>, 2 total enums
some_class_constant_ = 0n86
another_one_ = 0n99
Widać, że to lista wartości każdego wyliczenia nawet nienazwany jeden. Wiele nazw nienazwanych zostanie wymienionych poprawnie.
Problem z dt -r -v foo
jest to, że można znaleźć każdy członek foo
: Wszyscy członkowie danych, wszystkie elementy funkcyjne, wszystkie teksty stałe, i próbuje rekursja do każdego z nich i list jego członków. Jeśli foo
jest złożoną klasą, która jest raczej łatwa do uzyskania z dziedziczeniem, wynik będzie ogromny i trudno będzie znaleźć to jedno enum, którego szukasz.
Więc następnym rozwiązaniem jest powiedzieć dt
ENUM, które chcesz, a konkretnie:
0:000> dt foo::enum1
LangTestingD!foo::enum1
enum1_val1_ = 0n5
enum1_val2_ = 0n6
Dobra, świetnie! Ale co z tym nienazwanym wyliczeniem? Cóż, mówisz, sprawdź wyjście powyżej, gdzie używa <unnamed-tag>
. Może możemy tego użyć.
0:000> dt foo::<unnamed-tag>
Couldn't resolve error at 'foo::<unnamed-tag>'
To zadziała, ale musisz użyć kilku dodatkowych przełączników. Kiedy połączy -n
(po parametrem jest nazwa) i -y
(mecz następny parametr jako przedrostek nazwy) to, coś, działa:
0:000> dt -n -y foo::<unnamed-tag>
LangTestingD!foo::<unnamed-tag>
some_class_constant_ = 0n86
Jednak tylko pierwsza wartość jest na liście. Co gorsza, jeśli istnieje wiele nienazwanych wyliczeń, wymieniona jest tylko pierwsza wartość pierwszego. Często to wystarczy, ponieważ wiele nienazwanych wyliczeń nie jest zbyt częste, ale jeśli ich absolutnie potrzebujesz, musisz użyć -r -v
i po prostu znaleźć je w wynikach.