Во-первых, проверка всех локальных переменных во время выполнения самим процессом кажется невозможной, поскольку у C нет никаких средств для отражения.
Во-вторых, вам было бы намного лучше, если бы вы написали макрос регистрации так:
#include <stdio.h>
#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
#define GLOGF(fmt, ...) \
printf("%s:%s " fmt "\n", __func__, __FILE__ "!" TOSTRING(__LINE__), ##__VA_ARGS__)
int main (void) {
/* main:test.c!xx count=5 */
GLOGF("count=%d", 5);
/* main:test.c!xx */
GLOGF();
return 0;
}
Это проще и не приводит к дополнительным накладным расходам времени выполнения, поскольку строка сцепляется во время компиляции.
Также обратите внимание, что я использовал __func__
вместо __FUNCTION__
, потому что последний нестандартный.