Printf i wypisywanie format specifier

0

W sumie nie myślałem, że będę o to pytać, no ale nawet niekoniecznie przydatnej na uczelni nauki nigdy za wiele.

Mam problem, jak napisać funkcję void debugowanie(arg1, arg2, arg3) (powiedzmy, taka nazwa ;) ), która będzie wypisywać arg1, arg2, arg3 do konsoli.

Problemem jest dokładnie to, że chciałbym móc przekazać do tej funkcji argumenty różnych typów (tzn. nie zawsze const char * lub char *). To znaczy - arg1 i arg2 niech będą const char *, bo akurat tak mi potrzeba, a arg3niech będzie argumentem o typie zależnym od tego, co akurat mi potrzeba wypisać.

Na przykład, chcę wywołać tę funkcję tak:

int i = 9;
debugowanie("jakisNapis ", "i=", i);

I teraz: w definicji tej funkcji nie mogę użyć printf, ponieważ printf powinien mieć format specifier, który powinien być znany na etapie kompilacji, jak mniemam (mylę się?). Jeśli nie, to jak w takim razie "wypisać" format specifier? Przecież nie wywołam tak: debugowanie("i=", "%d", i), bo nie mam jak wpisać tego "%d" w printfie.

Jak to zrobić? Czy w ogóle się da, czy muszę zawsze konwertować/rzutować na odpowiedni typ przy wywołaniu ( char * str; sprintf(str, "%d", i); debugowanie("jakisTekst", "i=", str) ) ?

Przepraszam za ewentualne podstawowe błędy.

1
Michał Bodziony napisał(a):

I teraz: w definicji tej funkcji nie mogę użyć printf, ponieważ printf powinien mieć format specifier, który powinien być znany na etapie kompilacji, jak mniemam (mylę się?). Jeśli nie, to jak w takim razie "wypisać" format specifier? Przecież nie wywołam tak: debugowanie("i=", "%d", i), bo nie mam jak wpisać tego "%d" w printfie.

#include <stdio.h>

void foo(const char* format, const char* str, const char* format2, int value)
{
	printf(format, str);
	printf(format2, value);
}

int main() 
{
	foo("%s", "ala ma kaca\n", "%d", -15);
	return 0;
}
0

A, już wiem, o czym nie pomyślałem: twój program działa, ponieważ parametr nie jest typu void * (potrzeba mi tego, ponieważ nie wiem, jakie będą argumenty na etapie kompilacji). A voida już nie mogę na wszystko rzutować (np. na int się da, ale na long double już nie).

Zdaje mi się teraz, że to problem nie do rozwiązania, ponieważ jest to związane z systemem typów C...

1

@Michał Bodziony poszukaj sobie jak loggery sa pisane w jezyku C
Napisanych loggerow jest multum, takze znajdziesz rozwiazanie ktore potrzebujesz.

1 użytkowników online, w tym zalogowanych: 0, gości: 1