2010-08-02 41 views

Trả lời

8

Tùy thuộc vào giá trị của ENABLE_DEBUG, LOG_MSG là một trong hai định nghĩa là một bí danh cho printf() hay nó được định nghĩa là một macro không-op. Nó được ngụ ý rằng bạn có thể thay đổi giá trị thành 0 để vô hiệu hóa gỡ lỗi. Đây là một kỹ thuật phổ biến giúp dễ dàng chuyển đổi giữa các bản dựng gỡ lỗi hiển thị nhiều bản dựng đầu ra và bản phát hành yên tĩnh.

#define LOG_MSG printf 

Điều này biến nó thành bí danh cho printf().

#define LOG_MSG(...) /* empty */ 

Và điều này định nghĩa nó là macro trống. Lưu ý rằng ở đây nó có một tập hợp các dấu ngoặc đơn, có nghĩa là macro nhận các tham số. Nó không có gì sau đó có nghĩa là nó mở rộng để hoàn toàn không có gì. Và ... cho biết rằng macro này có thể mất varying number of arguments. Cú pháp này là một phần mở rộng C99 để nó có thể không có sẵn trên các trình biên dịch C cũ hơn.

LOG_MSG("file not found\n"); 

Kết quả là cuộc gọi LOG_MSG() sẽ in hoặc nhắn tin hoặc tùy thuộc vào việc ghi nhật ký có được bật hay không.

// If ENABLE_DEBUG is non-zero, a debugging printout: 
printf("file not found\n"); 

// If ENABLE_DEBUG is zero, an empty statement: 
; 

Đối với những gì nó có giá trị, ai là tác giả vĩ mô này có thể đã thực hiện một công việc tốt hơn bằng cách thay thế định nghĩa đầu tiên với một bằng cách sử dụng ... cú pháp (mà anh/cô ấy rõ ràng là quen thuộc với), in ấn để thiết bị lỗi chuẩn thay vì stdout:

#define LOG_MSG(...) fprintf(stderr, __VA_ARGS__) 
1

Điều này sử dụng bộ tiền xử lý để thay đổi mã trước khi biên dịch. Nếu ENABLE_DEBUG được định nghĩa là 1, bất cứ khi nào Preprocessor thấy

LOG_MSG("something happened"); 

Nó sẽ thay thế nó với

printf("something happened"); 

Nếu nó được định nghĩa là 0, hoặc chưa xác định nó sẽ thay thế nó bằng gì (như câu trả lời khác vừa được công bố nói).

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