2012-07-18 37 views
5

Đối debug logging, tôi thường nhìn thấy và sử dụng cái gì đó nhưđúng C Preprocessor vĩ mô không-op

#ifdef DEBUG 
    #define DLOG(fmt, args...) printf("%s:%d "fmt,__FILE__,__LINE__,args) 
#else 
    #define DLOG(fmt, args...) 
#endif 

nhưng trong một số nơi, tôi đã thấy thứ hai #define thay thế bằng

#define DLOG(fmt, args...) do {} while (0) 

Cụ thể, có this answer và nhận xét về this other answer cho cùng một câu hỏi cho thấy rằng sự cố sẽ xảy ra trong một tình huống như

if (condition) 
    DLOG("foo"); 

mặc dù thử nghiệm nhanh chóng của tôi cho thấy rằng dấu chấm phẩy kết quả trên dòng của chính nó sẽ phục vụ như là tuyên bố no-op bên trong điều kiện.

Là một hoặc khác của không có gìdo {} while (0) tốt hơn? Nếu vậy, tại sao? Có cái gì khác thậm chí còn tốt hơn?

+0

có thể trùng lặp của [do {...} trong khi (0) điều gì là tốt cho?] (Http://stackoverflow.com/questions/257418/do-while-0-what-is-it-good -cho) –

Trả lời

5

Xem C#define macro for debug printing để được giải thích lý do tại sao bạn muốn có hình thức không có hình thức khác. Bạn muốn có trình biên dịch phân tích gỡ lỗi mã in ngay cả khi bạn không sử dụng nó để lỗi không leo vào

0

Câu trả lời nhanh là phương thức do/while cho phép bạn có thay thế nhiều câu lệnh và vẫn sử dụng nó như một câu lệnh trong trường hợp if giống như bạn có trong câu hỏi của mình. Đối với một thay thế biểu thức duy nhất, tôi không nghĩ rằng có bất kỳ sự khác biệt.

7

Một dấu chấm phẩy bởi chính nó có hai nhược điểm:.

  • Người sử dụng lon macro của bạn viết nó mà không có dấu chấm phẩy và trình biên dịch sẽ không khiếu nại, và
  • Một số trình biên dịch có thể đưa ra cảnh báo về dấu chấm phẩy có thể đi lạc.

Các do {} while (0) địa chỉ lừa cả những lo lắng:

DLOG("foo") // No semicolon 

sẽ kích hoạt một lỗi, và trình biên dịch sẽ không cảnh báo bạn về một dấu chấm phẩy "đi lạc".

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