-
1. Data: 2009-03-31 19:30:35
Temat: AVR-GCC - sterowanie kompilacją
Od: tomi <z...@g...pl>
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 ?
-
2. Data: 2009-03-31 19:36:54
Temat: Re: AVR-GCC - sterowanie kompilacją
Od: Adam Dybkowski <a...@4...pl>
tomi pisze:
> 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.
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.
--
Adam Dybkowski
http://dybkowski.net/
Uwaga: przed wysłaniem do mnie maila usuń cyfry z adresu.
-
3. Data: 2009-03-31 19:43:27
Temat: Re: AVR-GCC - sterowanie kompilacją
Od: "zbyszek" <z...@o...eu>
> 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 ?
metodą "Znajdz i zastap" printf( => #ifdef DEBUG printf( -reszta
recznie
albo printf( => // printf(
z
-
4. Data: 2009-03-31 20:00:03
Temat: Re: AVR-GCC - sterowanie kompilacją
Od: tomi <z...@g...pl>
Adam Dybkowski wrote:
> tomi pisze:
>
>> 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.
>
> 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.
>
ale tu też będę miał problem ze zmienną ilością argumentów ?
-
5. Data: 2009-03-31 20:40:48
Temat: Re: AVR-GCC - sterowanie kompilacją
Od: Adam Dybkowski <a...@4...pl>
tomi pisze:
>>> 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.
>>
>> 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
[...]
>> Podobnie zrób z printf_P bo z niej pewnie częściej korzystasz.
> ale tu też będę miał problem ze zmienną ilością argumentów ?
:-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;
}
--
Adam Dybkowski
http://dybkowski.net/
Uwaga: przed wysłaniem do mnie maila usuń cyfry z adresu.
-
6. Data: 2009-03-31 22:29:12
Temat: Re: AVR-GCC - sterowanie kompilacją
Od: Marcin Łukasik <.marcin.@.milea.pl.>
tomi pisze:
> ale tu też będę miał problem ze zmienną ilością argumentów ?
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.
--
Milea Wireless Communications, http://milea.pl
Anteny WiFi, UMTS, kable, zlacza, akcesoria.
``Be who you are and say what you feel, because those who mind don't
matter and those who matter don't mind.''
-
7. Data: 2009-03-31 22:57:13
Temat: Re: AVR-GCC - sterowanie kompilacją
Od: Marcin Łukasik <.marcin.@.milea.pl.>
Marcin Łukasik pisze:
> To przed programem głównym (polecam po wszystkich #include) załatwia
> sprawę:
> int printf (__const char *__restrict __format, ...) { return 1; }
...albo idąć Twoim tokiem rozumowania:
#ifndef DEBUG
int printf (__const char *__restrict __format, ...) { return 1; }
#endif
m.
--
Milea Wireless Communications, http://milea.pl
Anteny WiFi, UMTS, kable, zlacza, akcesoria.
``Be who you are and say what you feel, because those who mind don't
matter and those who matter don't mind.''
-
8. Data: 2009-04-01 06:45:58
Temat: Re: AVR-GCC - sterowanie kompilacją
Od: "Artur M. Piwko" <m...@b...pl>
In the darkest hour on Tue, 31 Mar 2009 21:30:35 +0200,
tomi <z...@g...pl> screamed:
> 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ć ?
>
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)
**/
> #ifdef DEBUG
> printf("i= %d\n", i);
> #endif
>
> ale jak to wstawić automatycznie przy każdym printfie ?
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
--
[ Artur M. Piwko : Pipen : AMP29-RIPE : RLU:100918 : From == Trap! : SIG:221B ]
[ 08:30:00 user up 12029 days, 20:25, 1 user, load average: 0.50, 0.18, 0.45 ]
Make it right before you make it faster.
-
9. Data: 2009-04-01 17:32:36
Temat: Re: AVR-GCC - sterowanie kompilacją
Od: "pawel" <p...@p...onet.pl>
Użytkownik "tomi" <z...@g...pl> napisał w wiadomości
news:gqtr0t$8be$1@inews.gazeta.pl...
>
> 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.
>
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ł
-
10. Data: 2009-04-01 20:23:37
Temat: Re: AVR-GCC - sterowanie kompilacją
Od: Adam Dybkowski <a...@4...pl>
pawel pisze:
>> 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.
>
> 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));
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).
--
Adam Dybkowski
http://dybkowski.net/
Uwaga: przed wysłaniem do mnie maila usuń cyfry z adresu.