История изменений
Исправление vbr, (текущая версия) :
Когда я делал подобную ерунду, у меня это как-то так выглядело:
LOG(a1, a2)
-> log_start(); log_arg(a1); log_arg(a2); log_end();
log_arg
это была _Generic функция, которая в зависимости от параметра вызывала log_arg_int
и тд. Это, конечно, не совсем в тему, но вообще мне вполне хватало для моих небольших нужд, было удобно и типобезопасно. Для опций форматирования я делал доп-функцию, к примеру LOG(fmt_float(f, 2))
, где функция fmt_float возвращала некую структуру struct fmt_float {float value; int precision; }
, а функция log_arg
имела перегрузку для этой структуры.
Исходная версия vbr, :
Когда я делал подобную ерунду, у меня это как-то так выглядело:
LOG(a1, a2)
-> log_start(); log_arg(a1); log_arg(a2); log_end();
log_arg
это была _Generic функция, которая в зависимости от параметра вызывала log_arg_int
и тд. Это, конечно, не совсем в тему, но вообще мне вполне хватало для моих небольших нужд, было удобно и типобезопасно. Для опцией форматирования я делал доп-функцию, к примеру LOG(fmt_float(f, 2))
, где функция fmt_float возвращала некую структуру struct fmt_float {float value; int precision; }
, а функция log_arg
имела перегрузку для этой структуры.