AVR-GCC - sterowanie kompilacją

Pytanie odnośnie AVR-GCC:

Mam w kodzie kilkanaście funkcji printf z różną ilością argumentów, jak można je hurtowo włączyć lub wyłączyć przy kompilacji.

Próbowałem za pomocą dyrektywy #define je przedefiniować na puste funkcje: #define printf(x) #define printf(x,y,z) ale tu mam problem z ilością argumentów, można je tak przedefiniować ?

Myślałem też o takim rozwiązaniu:

#ifdef DEBUG printf("i= %d\n", i); #endif

ale jak to wstawić automatycznie przy każdym printfie ?

Reply to
tomi
Loading thread data ...

tomi pisze:

Zrób w oddzielnym pliku własną funkcję printf o takim prototypie, jak oryginalna (zależnie od twojego widzimisię: albo pustą, albo robiącą to co normalnie przy pomocy vprintf - możesz to ustalać na bieżąco na podstawie np. swojej zmiennej globalnej włączającej printf'y, albo włączać na stałe kompilacją warunkową). Plik z printf'em linkuj z całą resztą twojego projektu - wtedy nie zostanie dołączona biblioteczna funkcja printf. Voila!

Podobnie zrób z printf_P bo z niej pewnie częściej korzystasz.

Reply to
Adam Dybkowski

metodą "Znajdz i zastap" printf( => #ifdef DEBUG printf( -reszta recznie albo printf( => // printf(

z
Reply to
zbyszek

ale tu też będę miał problem ze zmienną ilością argumentów ?

Reply to
tomi

tomi pisze:

[...]

:-o Nigdy nie pisałeś funkcji w C ze zmienną liczbą argumentów? Albo takiej "opakowującej" printf?

int printf (const char *__fmt, ...) { va_list ap; int res;

va_start (ap, fmt); res = vprintf (fmt, ap); va_end (ap);

return res; }

Reply to
Adam Dybkowski

tomi pisze:

O co Ci chodzi? Zrób dokładnie tak jak napisał Adam i będzie działać.

Ilość argumentów w przypadku printf jest zmienna ("...").

Zbuduj pustą funkcję w swoim programie o takiej samej nazwie i będzie ok.

To przed programem głównym (polecam po wszystkich #include) załatwia sprawę: int printf (__const char *__restrict __format, ...) { return 1; }

m.

Reply to
Marcin Łukasik <..

Marcin Łukasik pisze:

...albo idąć Twoim tokiem rozumowania:

#ifndef DEBUG int printf (__const char *__restrict __format, ...) { return 1; } #endif

m.

Reply to
Marcin Łukasik <..

In the darkest hour on Tue, 31 Mar 2009 21:30:35 +0200, tomi snipped-for-privacy@gazeta.pl screamed:

Variadic macros. AVR-GCC (jak i GCC) je obsługuje.

#define printf(format, ...) /* jeśli chcesz przy okazji wymusić min. 1 argument */

lub ogólniej:

#define printf(...) lub #define printf(args...) /* powyższe niczym się nie różnią, dopóki nie będziesz chciał czegoś * zrobić z argumentami makra: * - z pierwszego: printf(__VA_ARGS__) * - z drugiego: printf(args)

**/

Osobiście zrobiłbym własną funkcję, np. dprintf (od debug), i ją dopiero przełączał, tak jest ładniej. ;>

#ifdef DEBUG #define dprintf(format, ...) printf(format, ##__VA_ARGS__) #else #define dprintf(format, ...) #endif

Reply to
Artur M. Piwko

Użytkownik "tomi" snipped-for-privacy@gazeta.pl napisał w wiadomości news:gqtr0t$8be$ snipped-for-privacy@inews.gazeta.pl...

Ja to robię tak #ifdef DEBUG #define DEBUG_PRINT(arg) printf arg #define DEBUG_PRINT_P(arg) printf_P arg #else #define DEBUG_PRINT(arg) #define DEBUG_PRINT_P(arg) #endif

i zamiast funkcji printf używam np: DEBUG_PRINT(("blabla%dblabla", i)); Muszą być podówjne nawiasy.

Pozdrawiam Paweł

Reply to
pawel

pawel pisze:

Ja używam w tym celu makra DBG_P - jest krócej napisać. I nie wymaga podwójnych nawiasów ale wygląda raczej tak: DBG_P(printf("BLABLA%d",i);) Daje to możliwość opcjonalnego wyłączania też innych kawałków kodu, nie tylko funkcji printf.

Ale rzeczywiście to "super wygodne" rozwiązanie nijak się ma do nakładu pracy z przerobieniem masy gotowego napisanego wcześniej kodu. :-| Gdy się od razu tak nie pisało "debugów". W takim przypadku proponuję zlinkować z programem własną funkcję printf i będzie po kłopocie. A debugowanie można sobie wtedy dynamicznie włączać i wyłączać, np. na podstawie jakiejś zmiennej (jest to możliwe bo teksty będą obecne cały czas w pamięci programu).

Reply to
Adam Dybkowski

Dziękuje za podpowiedzi, teraz już wiem jak sterować taką kompilacją.

Reply to
tomi

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.