2013-07-29 10 views

risposta

9

Utilizzare la macro NDEBUG. Oppure potresti davvero fare #ifdef su qualsiasi cosa.

#ifdef NDEBUG 

#define LOGD(...) 

#else 

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

#endif 

Poi per il codice:

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

Il compilatore vedrà (grosso modo - ANDROID_LOG_DEBUG e LOG_TAG saranno anche sostituiti con i loro valori, se sono le macro):

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

quando NDEBUG non è definito e vedrà:

void f() 
{ 
    ; 
    doSomeStuff(); 
} 

quando NDEBUG è definito.

+0

Ma con NDEBUG la chiamata al LOGD sarebbe ancora nel binario, lasciando la stringa di messaggio della chiamata da estrarre da potenziali hacker. C'è un modo più semplice di usare #ifdef rispetto ad ogni chiamata al registro D? grazie – pt123

+0

'LOGD' è una macro, non una funzione. Il preprocessore lo rimuoverà prima che il compilatore lo veda. Sarà come se la chiamata non si è verificata affatto. Inoltre, non dovresti circondare ogni chiamata a 'LOGD'. Questa è la * definizione * di 'LOGD', quindi devi farlo una sola volta per ogni definizione data di' LOGD'. – Joel

+1

Più precisamente, il preprocessore è il * solo * modo di eliminare le cose dal binario finale. Qualsiasi cosa basata nella lingua memorizzerà i tuoi valori letterali di stringa nella memoria statica. Il metodo che ho mostrato rimuove completamente le stringhe dal tuo codice sorgente. Il compilatore non includerà nel file binario ciò che non vede mai. E 'NDEBUG' è la base di 'assert'. Le asserzioni vengono rimosse dalle versioni di rilascio. – Joel

Problemi correlati