Cân nhắc macro này:macro variadic với zero đối số, và dấu phẩy
#define MAKE_TEMPLATE(...) template <typename T, __VA_ARGS__ >
Khi sử dụng với zero lập luận nó tạo ra mã xấu kể từ khi biên dịch hy vọng một định danh sau dấu phẩy. Trên thực tế, bộ tiền xử lý của VC đủ thông minh để loại bỏ dấu phẩy, nhưng GCC thì không. Kể từ macro không thể bị quá tải, nó có vẻ như phải mất một macro riêng biệt đối với trường hợp đặc biệt này để làm cho nó đúng, như trong:
#define MAKE_TEMPLATE_Z() template <typename T>
Có cách nào để làm cho nó làm việc mà không giới thiệu vĩ mô thứ hai?
Cảm ơn. btw, là hành vi tiêu chuẩn này, hay một điều gcc? – uj2
@ uj2: Đó là GCC; tiêu chuẩn chỉ đơn giản là cấm danh sách variadic trống. Bằng cách này, điều này là trộn C99 với C++ anyway, vì vậy mã này là đúng tiêu chuẩn, trừ khi bạn đang ở trong C++ 0x ... trong trường hợp bạn nên ... – Potatoswatter
Đừng bận tâm các mẫu, nó chỉ là một ví dụ đồ chơi. Làm thế nào là điều này nhất thiết phải 0x, không C++ 98/03 xác định các macro variadic? – uj2