xem xét cấu trúc nhỏ này:
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,
};
};
Cách nhanh nhất là sử dụng lệnh dt
, sử dụng công tắc -r
(recurse, mà bạn cần phải liệt kê các enum
thành viên) và -v
(verbose, mà bạn cần phải liệt kê enum
s ở tất cả):
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
Bạn có thể thấy rằng nó liệt kê các giá trị của từng enum, thậm chí cả tên chưa được đặt tên. Nhiều enums chưa được đặt tên sẽ được liệt kê chính xác.
Vấn đề với dt -r -v foo
là nó liệt kê tất cả các thành viên duy nhất của foo
: tất cả các thành viên dữ liệu, tất cả các thành viên chức năng, tất cả enums, và nó cố gắng recurse vào mỗi người và danh sách thành viên. Nếu foo
là một lớp phức tạp, mà là khá dễ dàng để có được với thừa kế, đầu ra sẽ rất lớn, và nó sẽ rất khó để tìm thấy một enum bạn đang tìm kiếm.
Vì vậy, lựa chọn tiếp theo là nói dt
mà enum mà bạn muốn, cụ thể là:
0:000> dt foo::enum1
LangTestingD!foo::enum1
enum1_val1_ = 0n5
enum1_val2_ = 0n6
Được rồi, tuyệt vời! Nhưng làm thế nào về enumed enum? Vâng, bạn nói, kiểm tra đầu ra ở trên, nơi nó sử dụng <unnamed-tag>
. Có lẽ chúng ta có thể sử dụng nó.
0:000> dt foo::<unnamed-tag>
Couldn't resolve error at 'foo::<unnamed-tag>'
Nó thực sự sẽ hoạt động nhưng bạn cần sử dụng thêm một vài công tắc. Khi bạn kết hợp -n
(tham số sau đây là một cái tên) và -y
(phù hợp với thông số tiếp theo như một tiền tố tên) sau đó nó, loại, hoạt động:
0:000> dt -n -y foo::<unnamed-tag>
LangTestingD!foo::<unnamed-tag>
some_class_constant_ = 0n86
Tuy nhiên, chỉ có giá trị đầu tiên được liệt kê. Thậm chí tệ hơn, nếu có nhiều enumsed unums, chỉ có giá trị đầu tiên của cái đầu tiên được liệt kê. Thường thì điều này sẽ là đủ, vì nhiều enums chưa được đặt tên không phải là quá phổ biến, nhưng nếu bạn hoàn toàn cần chúng, bạn sẽ phải sử dụng -r -v
và chỉ tìm thấy chúng trong đầu ra.