2012-06-11 36 views
7

thể trùng lặp:
How to make a variadic macro (variable number of arguments)Tôi có thể có macro C chấp nhận số tham số không xác định không?

Tôi muốn có một macro ghi trong C cơ bản mà chấp nhận lập luận tương tự như printf và ghi lại chúng. Tuy nhiên, tôi muốn làm thế nào nó được đăng nhập (mức độ đăng nhập, tập tin vs stderr, vv) để được một cái gì đó thiết lập tại thời gian biên dịch, không phải thời gian chạy; với phương thức không làm gì cả và hy vọng được tối ưu hóa ra khỏi mã nếu tôi đặt tham số để bỏ qua việc ghi nhật ký mức thấp.

Cho đến nay tôi có macro được xác định dựa trên tham số được xác định tại thời gian biên dịch. Nếu tham số được xác định khai thác gỗ đi vào phương pháp đăng nhập của tôi (để đăng nhập vào các tập tin) nếu không nó đi đến stderr. Tuy nhiên, tôi chỉ có thể chuyển một chuỗi vào macro này. Phương thức log có khả năng lấy một số lượng đối số vô hạn và hoạt động bằng cách sử dụng cú pháp printf. Tôi muốn biết nếu có một cách để thiết lập vĩ mô của tôi lên vì vậy nó sẽ vượt qua một số lượng vô hạn các đối số vào tập tin đăng nhập?

Và kể từ khi tôi nghi ngờ câu trả lời là tôi không thể làm điều đó là có một phương pháp khác để đạt được những gì tôi muốn trong C cơ bản (tôi không thể sử dụng C + + hoặc tăng).

Trả lời

7

C99 có các macro có thể chấp nhận số lượng đối số thay đổi. Chúng được gọi là Macro biến thể.

http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html

Ví dụ:

#define eprintf(...) fprintf (stderr, __VA_ARGS__) 
#define dfprintf(stream, ...) fprintf(stream, "DEBUG: " __VA_ARGS__) 
2

Có bạn có thể. C99 hỗ trợ số này out of the box.

Cú pháp trông giống như:

#define debug(format, ...) fprintf (stderr, format, ## __VA_ARGS__)

Các vấn đề liên quan