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");
vì __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 !!!
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
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 –
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