2016-09-05 2 views
3

Я пишу программу на C, которая использует собственную функцию ведения журнала для отладки моей программы. Всякий раз, когда я компилирую свою программу в качестве выпуска, я хочу, чтобы все мои функции ведения журнала были удалены из кода, чтобы он не отображался, если кто-то пытается его разобрать.Зачистка определенных функций во время компиляции

Рассмотрим следующий пример:

#include <stdio.h> 

void custom_logging_function(char* message) 
{ 
    // Do something here 
} 

int main() 
{ 
    custom_logging_function("Hello world"); // This call should be removed. 
    return 0; 
} 

Как я мог сделать это так, чтобы custom_logging_function и это аргументы не скомпилированы в моей программе, без необходимости писать включать охранников везде на протяжении всего моего кода? Спасибо

+0

Почему вас волнует, если они лишены компилятором или компоновщиком? – Olaf

+0

@ Олаф - это комбинация вещей, во-первых, производительность и двоичный размер, а второй - это то, что люди не смогут декомпилировать мою программу и видеть бесплатные внутренние заметки о программе, если они хотят разорвать ее на части. – Paradoxis

+0

Не делайте преждевременных оптимизаций! Если у вас возникла проблема с синхронизацией, профайл вашего кода. Вы, кажется, не поняли моего комментария. Конечно, вы можете заменить функцию манекеном. Просто оставьте остальную часть инструментальной цепочки. Не знаю, как это будет препятствовать декомпиляции. Это всего лишь функция меньше. (действительно интересно, как программисты заботятся о таких вещах, но игнорируют гораздо более важные проблемы). – Olaf

ответ

6

Вы можете использовать препроцессор флаги, например:

#include <stdio.h> 

#ifdef DEBUG 
void custom_logging_function(char* message) 
{ 
    // Do something here 
} 
#else 
#define custom_logging_function(x) ((void) 0) 
#endif 

int main() 
{ 
    custom_logging_function("Hello world"); // This call should be removed. 
    return 0; 
} 

С помощью этого кода вы должны сказать «отладка» цели определить DEBUG, если вы хотите, чтобы определить что-то специально для «release» вы можете заменить #ifdef DEBUG на #ifndef NDEBUG и добавить флаг NDEBUG в определения «выпуска».


Edit:

Изменено #define custom_logging_function(x) 0 к #define custom_logging_function(x) ((void) 0) вдохновленный @JoachimPileborg его ответ.

+0

Я думаю, что '#define custom_logging_function (x) 0' должно быть' #define custom_logging_function (x) ', чтобы избежать предупреждения:' statement без эффекта' –

+0

Как насчет аргументов, если кто-то декомпилирует это, они могли видеть строка 'Hello world', или это тоже мешает? – Paradoxis

+0

@AlterMann, если вы определяете его для возврата 0, вы все равно можете использовать функцию в качестве аргумента для другой функции. – tversteeg

3

Предполагая, что вы хотите, чтобы звонки в журнале выполнялись в отладочной версии вашего приложения, а не в сборке выпуска, которую вы отправляете клиентам, вы все равно можете использовать препроцессор и условную компиляцию для него. Это может быть сделано простым, хотя при использовании макросов вместо проверок при каждом вызове.

Нечто подобное в файле Хедер:

#ifdef _DEBUG 
void custom_logging_function(char* message); 
#else 
# define custom_logging_function(message) ((void) 0) 
#endif 

Вы можете использовать пустое тело макроса для выпуска-макро, но это может вызвать некоторые компиляторы дать «пустое утверждение» предупреждения. Вместо этого я использую выражение casted to void (чтобы сообщить компилятору, что результат выражения не будет использоваться). Любой умный компилятор не будет включать выражение после оптимизации.

Смежные вопросы