2012-04-09 35 views
7

tôi viết macro sau để gỡ lỗi convinience,Tại sao biên dịch phàn nàn về khai macro này

1 #ifndef DEF_H 
2 #define DEF_H 
3 #define DEBUG_MODE 
4 #define DEBUG_INFO(message)  \ 
5   #ifdef DEBUG_MODE  \ 
6     cout << message << endl; \ 
7   #endif       \ 
8 #endif 

nhưng gcc phàn nàn như sau

def.h:4: error: '#' is not followed by a macro parameter 
def.h:1: error: unterminated #ifndef 

Có gì sai với đoạn mã này? Tôi có bỏ lỡ một số điểm quan trọng ở đây không?

+0

Bạn nên chấp nhận câu trả lời tốc độ! – gsamaras

Trả lời

18

Bạn không thể có #ifdef s bên trong định nghĩa macro. Bạn cần phải biến nó từ trong ra ngoài:

#ifdef DEBUG_MODE 
#define DEBUG_INFO(message) cout << (message) << endl 
#else 
#define DEBUG_INFO(message) 
#endif 
+0

Cảm ơn bạn. Vì vậy, làm thế nào tôi có thể đạt được mục tiêu bằng cách sử dụng vĩ mô để kiểm soát chuyển đổi gỡ lỗi. Ở cuối ứng dụng, tôi muốn gọi một dòng duy nhất như DEBUG_INFO ("thông tin gỡ lỗi") – speedmancs

+0

@speedmancs: Xem câu trả lời cập nhật của tôi. –

+0

+1. Ngoài ra, có dấu gạch chéo ngược sau dòng 7, điều này làm cho dòng #endif ở dòng cuối cùng là một phần của dòng 4 và không khớp với #ifndef trong dòng đầu tiên –

1

Bạn không thể nhúng một chỉ thị tiền xử lý trong một chỉ thị tiền xử lý (các #ifdef DEBUG_MODE bên trong định nghĩa của DEBUG_INFO). Thay vào đó, làm điều gì đó như

#ifdef DEBUG_MODE 
# define DEBUG_INFO(message) cout << message << endl 
#else 
# define DEBUG_INFO(message) 0 
#endif 

(Đây là vẫn không lý tưởng; mã hóa vĩ mô phòng thủ cho thấy một cái gì đó giống như

#ifdef DEBUG_MODE 
# define DEBUG_INFO(message) do {cout << message << endl;} while (0) 
#else 
# define DEBUG_INFO(message) 0 
#endif 

Có lẽ một chức năng inline sẽ làm việc tốt hơn.)

0

tôi geuss nếu bạn ăn '\' ở dòng 7, đoạn mã sẽ hoạt động.

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