2011-09-22 27 views
23

Tôi gần như hoàn thành một NSLog sạch với mã này:sạch NSLog - Không dấu thời gian và chương trình tên

#define NSLog(FORMAT, ...) printf("%s\n", [[NSString stringWithFormat:FORMAT, __VA_ARGS__] UTF8String]); 

tốt công việc này nếu tôi làm điều này:

NSLog(@"Show %@ message", @"this"); 

Nhưng, sẽ thất bại nếu tôi sử dụng nó

NSLog(@"One argument"); 

__VA_ARGS__ là không có gì, vì vậy nó tạo ra

printf("%s\n", [[NSString stringWithFormat:@"One argument",] UTF8String]); 

Vì vậy, sự cố là dấu phẩy. Bởi vì đây là macro, __VA_ARGS__ là không có gì. Vì vậy, tôi không thể làm những việc như __VA_ARGS__==nil vì sẽ sản xuất ==nil và sẽ không thành công.

Câu hỏi rất đơn giản: Phải làm gì khi __VA_ARGS__ là gì? Hoặc chỉ sử dụng dấu phẩy khi có nhiều đối số hơn.

- Chỉnh sửa -

Xuzhe giải quyết vấn đề! Để trở thành mã tốt nhất, có thể sử dụng mã theo cách này:

#ifdef DEBUG 
#define NSLog(FORMAT, ...) fprintf(stderr,"%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]); 
#else 
#define NSLog(...) 
#endif 

Bây giờ, không còn nhật ký lộn xộn nữa !!!

Trả lời

56

Sử dụng mã này (chú ý phần ##):

#define NSLog(FORMAT, ...) fprintf(stderr, "%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]); 
+0

tốt công việc. Tôi nghĩ rằng '##' không có ý nghĩa với '__VA_ARGS__', nhưng làm việc. – Rodrigo

+4

Bạn nên thay đổi printf ("% s \ n" thành fprintf (stderr, "% s \ n".) Vì nhiều lý do, quan trọng nhất, printf đi tới stout được lưu trong bộ nhớ cache, stderr không được lưu trong bộ nhớ cache là đầu ra ngay lập tức –

+0

Hum .. @Nathan Day Tôi thấy những thứ như thế này và không hiểu. Nhưng nếu nó làm cho mọi thứ tốt hơn, tôi sẽ sử dụng :) – Rodrigo

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