2009-10-04 20 views
13

Chương trình của tôi ghi vào nhật ký và xuất bản. Mỗi tin nhắn, tuy nhiên, có một ưu tiên nhất định và người sử dụng chỉ định trong Preferences ưu tiên mà đi đến dòng (log hoặc stdout).chức năng printf wrapper lọc theo sở thích của người dùng

unsigned short PRIO_HIGH = 0x0001; 
unsigned short PRIO_NORMAL = 0x0002; 
unsigned short PRIO_LOW = 0x0003; 

Chế độ ưu đãi được xử lý bởi một số cờ:

unsigned short PRIO_LOG = (PRIO_HIGH | PRIO_NORMAL); 
unsigned short PRIO_STD = (PRIO_HIGH); 

Chức năng write_log nên làm việc với các thông số tương tự như chức năng printf, với tham số bổ sung của unsigned short priority.

write_log((PRIO_NORMAL|PRIO_LOW), "HELLO %s, take %d", "World", 1); 

(Thậm chí nếu PRIO_NORMAL|PRIO_LOW làm cho chút cảm giác ...)

Kiểm tra cờ rất dễ dàng: if(priority & PRIO_LOG) (Returns> 1 nếu có cờ được thiết lập ở cả hai đối số)

tôi không thể tuy nhiên tìm làm thế nào tôi sẽ đi về đi qua các chuỗi đối số định dạng cho hàm printf. Bất cứ ai có thể giúp hoặc cho tôi một con trỏ (có thể một phương pháp thay thế mà đạt được hiệu quả tương tự)? Nó sẽ được nhiều đánh giá cao.

Trả lời

33

Bạn muốn gọi vprintf() thay vì printf() sử dụng các đối số biến "varargs" khả năng của C.

int write_log(int priority, const char *format, ...) 
{ 
    va_list args; 
    va_start(args, format); 

    if(priority & PRIO_LOG) 
      vprintf(format, args); 

    va_end(args); 
} 

Để biết thêm thông tin, xem một cái gì đó dọc theo dòng của this.

+0

Trong Visual C++ bạn có thể sử dụng _____VA_ARGS_____ để thay thế. Tham khảo: http://msdn.microsoft.com/en-us/library/ms177415(v=vs.110).aspx –

+1

vui lòng chỉnh sửa để hiển thị bắt buộc '#include ' – robisrob

5

Tôi nghĩ ý tưởng của Jeff là cách để đi, nhưng bạn cũng có thể thực hiện việc này bằng macro mà không cần sử dụng vprintf. Điều này có thể yêu cầu gcc:

#define write_log(priority,format,args...)  \ 
        if (priority & PRIO_LOG) {  \ 
         printf(format, ## args); \ 
        } 

Kiểm tra here để biết thông tin về cách thức hoạt động.

4

Nếu bạn muốn PRIO_ * định nghĩa được sử dụng như bit (sử dụng | và &), bạn phải cung cấp cho mỗi một trong số họ chút riêng của mình:

unsigned short PRIO_HIGH = 0x0001; 
unsigned short PRIO_NORMAL = 0x0002; 
unsigned short PRIO_LOW = 0x0004; 

vĩ mô có thể được cải thiện bằng công việc phải làm {} trong khi ký hiệu (0). Nó làm cho các cuộc gọi để write_log hành động giống như một tuyên bố.

#define write_log(priority,format,args...) do { \ 
    if (priority & PRIO_LOG) { \ 
     printf(format, ## args); \ 
    } while(0) 
+0

Xin lỗi, Nhập. Tôi đã làm như vậy trong nguồn của tôi tất nhiên. cảm ơn vì đã chỉ ra! 1 cho một con mắt quan tâm. – wsd

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