Если условие является константой времени компиляции, значит, ваш код (после предварительной обработки) работает примерно так:
if (0)
do the logging
Тогда компилятор, как правило, будет достаточно умен, чтобы убрать мертвый код, включая строки, которые вы ему передали (если, конечно, вы также не использовали строки в другом коде, который не был удален).
Код, который действует как printf, довольно прост:
#include <stdarg.h>
void log(char const &fmt, ...) {
if (do_logging) {
va_list args;
va_start(args, fmt);
vfprintf(output_file, fmt, args);
}
}
В макросе (важно, чтобы он был в макросе, а не в вызываемой функции), вы можете использовать __FILE__
и __LINE__
для текущего номера строки и имени исходного файла, чтобы поместить в журнал. Используя приведенный выше код, вы (вероятно) захотите передать их перед строкой форматирования.