Tôi có mã macro này, cho phép tôi xác định cả hai tên C enum và danh sách tên được liệt kê dưới dạng chuỗi sử dụng một cấu trúc. Nó ngăn cản tôi không phải trùng lặp tên điều tra viên (và có thể giới thiệu lỗi cho các danh sách lớn).Đếm các macro tiền xử lý
#define ENUM_DEFINITIONS(F) \
F(0, Item1) \
F(5, Item2) \
F(15, Item3) \
...
F(63, ItemN)
thì:
enum Items {
#define ITEM_ENUM_DEFINE(id, name) name = id,
ENUM_DEFINITIONS(ITEM_ENUM_DEFINE)
#undef ITEM_ENUM_DEFINE
mà khi mở rộng, nên sản xuất:
enum Items {
Item1 = 0,
Item2 = 5,
Item3 = 15,
...
ItemN = 63,
}
Trong tập tin thực hiện, tôi có mã này:
const char* itemNames[TOTAL_ITEMS];
int iter = 0;
#define ITEM_STRING_DEFINE(id, name) itemNames[iter++] = #name;
ENUM_DEFINITIONS(ITEM_STRING_DEFINE)
#undef ITEM_STRING_DEFINE
đó, khi được mở rộng, tạo ra:
itemNames[iter++] = "Item1";
itemNames[iter++] = "Item2";
itemNames[iter++] = "Item3";
...
itemNames[iter++] = "ItemN";
Tôi muốn biết có bao nhiêu mục liệt kê mà tôi đã tạo trong thời trang này và có thể truyền cho các mảng biên dịch. Trong ví dụ trên, điều này sẽ xác định rằng TOTAL_ITEMS = N tại thời gian biên dịch. Có thể đếm số lần gọi macro bằng cách này không?
Tôi đã nhìn thấy đề cập đến một phi tiêu chuẩn COUNTER vĩ mô, tương tự như FILE và ĐƯỜNG DÂY macro, nhưng tôi hy vọng có một cách chuẩn hơn.
Cũng sẽ muốn nghe nếu có cách tốt hơn để đạt được điều này mà không cần phải sử dụng macro.
Tại sao bạn cần cả 'enum' và mảng chuỗi? – Philip
Dường như nó xuất hiện khá thường xuyên trong công việc của tôi. Một ví dụ sẽ là một máy trạng thái mà các trạng thái được liệt kê, và một giao diện người dùng sẽ hiển thị tên của trạng thái hiện tại. Thuận tiện của nó để xác định nó chỉ một lần, và làm cho nó dễ dàng hơn cho các nhà phát triển khác, những người muốn thêm các tiểu bang mới. – Eyal