2013-07-29 25 views

Trả lời

9

Sử dụng NDEBUG vĩ mô. Hoặc bạn thực sự có thể #ifdef trên mọi thứ.

#ifdef NDEBUG 

#define LOGD(...) 

#else 

#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__) 

#endif 

Sau đó cho mã:

void f() 
{ 
    LOGD("About to do some stuff"); 
    doSomeStuff(); 
} 

Trình biên dịch sẽ thấy (khoảng - ANDROID_LOG_DEBUGLOG_TAG cũng sẽ được thay thế bằng giá trị của họ nếu họ là macro):

void f() 
{ 
    __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,"About to do some stuff"); 
    doSomeStuff(); 
} 

khi NDEBUG không xác định và sẽ thấy:

void f() 
{ 
    ; 
    doSomeStuff(); 
} 

khi NDEBUG được xác định.

+0

Nhưng với NDEBUG, cuộc gọi tới LOGD sẽ vẫn ở dạng nhị phân, để lại chuỗi tin nhắn của cuộc gọi được các tin tặc tiềm năng trích xuất. Có cách nào sạch hơn bằng cách sử dụng #ifdef hơn xung quanh mọi cuộc gọi để đăng nhập D không? thanks – pt123

+0

'LOGD' là một macro, không phải là một hàm. Bộ tiền xử lý sẽ loại bỏ nó trước khi trình biên dịch nhìn thấy nó. Nó sẽ như thể cuộc gọi không xảy ra chút nào. Ngoài ra, bạn không nên bao quanh mọi cuộc gọi đến 'LOGD'. Đó là định nghĩa * của 'LOGD', vì vậy bạn chỉ phải thực hiện nó một lần cho bất kỳ định nghĩa đã cho nào của' LOGD'. – Joel

+1

Thêm vào vấn đề này, bộ tiền xử lý là cách duy nhất để loại bỏ mọi thứ khỏi nhị phân cuối cùng. Mọi thứ dựa trên ngôn ngữ sẽ lưu trữ các chuỗi ký tự chuỗi của bạn trong bộ nhớ tĩnh. Phương pháp tôi đã hiển thị sẽ xóa hoàn toàn các chuỗi khỏi mã nguồn của bạn. Trình biên dịch sẽ không bao gồm trong phần nhị phân những gì nó không bao giờ nhìn thấy. Và 'NDEBUG' là cơ sở của' khẳng định'. Các xác nhận được xóa khỏi bản phát hành bản phát hành. – Joel

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