AVR-GCC - sterowanie kompilacją

Mar 31, 2009 10 Replies

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 ?


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.

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

z

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

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; }

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.

Marcin Łukasik pisze:

...albo idąć Twoim tokiem rozumowania:

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

m.

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

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ł

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).

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

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required