Если вы полностью не отключите операторы printf, может быть скрыта ошибка.Рассмотрим следующий код:
printf("Result is %d\n", DoSomethingVeryImportant());
Когда вы заменяете вызов printf макросом, вы, вероятно, по-прежнему хотите убедиться, что вызывается внутренний вызов функции DoSomethingVeryImportant()
.В противном случае вы изменили логику своей программы.
И я полагаю, что вы, возможно, захотите, чтобы ваш mbedtls_printf фактически вызывал printf для отладочных сборок, но не включался в розничную сборку.
Если все вышеперечисленное имеет значение, рассмотрите это как mbedtls_printf.h:
#ifndef MBEDTLS_PRINTF_H
#define MBEDTLS_PRINTF_H
#include <stdarg.h>
#include <stdio.h>
#ifdef DEBUG_BUILD
inline int printf_stub(const char* s, ...)
{
va_list args;
va_start(args, s);
vprintf(s, args);
va_end(args);
}
#define mbedtls_printf(...) printf_stub(__VA_ARGS__)
#else
inline int printf_stub(...){return 1;}
#define mbedtls_printf(...) printf_stub(__VA_ARGS__)
#endif
#endif
Затем в коде:
#include <iostream>
#include "mbedtls_printf.h"
int ImportantFunction()
{
std::cout << "Really important code" << std::endl;
return 42;
}
int main()
{
mbedtls_printf("Result of a very important step: %d\n", ImportantFunction());
mbedtls_printf("This just happened");
mbedtls_printf("Result of a another important step: ", 43, 44, ImportantFunction());
return 0;
}
Компилятор оптимизирует пустой вызов функции ипо-прежнему вызывать ImportantFunction()
, как это было первоначально.