Pawel K
Guest
Thu Sep 11, 2008 8:21 am
Witam,
przesiadlem sie na winavr z wersji z 2006 roku i zaczely sie schody
w trakcie kompilacji
wszystkie f-cje inline sie sypia.
Tam gdzie wywoluje te funkcje linker wywala mi ze funkcja jest
zdeklarowana, ale niezdefiniowana ... Wywale slowo inline i wszystko gra
i huczy ...
Ki czort?
--
--
Pozrdawiam
Pawel K from 3miasto
groups(at)kpw.qs.pl
GG: 1263183
---------------- end ----------------
Raven
Guest
Thu Sep 11, 2008 8:52 am
Pawel K
Guest
Thu Sep 11, 2008 10:29 am
Raven pisze:
Quote:
a c99+ gnu ustawione ?
# gnu99 = c99 plus GCC extensions
CSTANDARD = -std=gnu99
plik z f-cjami inline kompiluje sie bezblednie jak widac:
Compiling C: dev/ads1110.c
avr-gcc -c -mmcu=atmega128 -I. -gdwarf-2 -DF_CPU=14745600UL -DV2 -Os -I
include -I include/dev -I include/menu -funsigned-char
-funsigned-bitfields -fpack-struct -fshort-enums -Wstrict-prototypes
-Wundef -Wa,-adhlns=obj/dev/ads1110.lst -Ic:\code\avr\avrlib -std=gnu99
-MD -MP -MF .dep/ads1110.o.d dev/ads1110.c -o obj/dev/ads1110.o
plik w ktorym wywoluje funkcje inline w trakcie kompilacji wywala takie
bledy:
include/dev/ads1110.h:6: warning: inline function 'ads1110_Convert_IN'
declared but never defined
include/dev/ads1110.h:5: warning: inline function 'ads1110_Convert'
declared but never defined
include/dev/ads1110.h:6: warning: inline function 'ads1110_Convert_IN'
declared but never defined
include/dev/ads1110.h:5: warning: inline function 'ads1110_Convert'
declared but never defined
w czym moze byc problem? ktory powstal w nowej wersji ...
--
--
Pozrdawiam
Pawel K from 3miasto
groups(at)kpw.qs.pl
GG: 1263183
---------------- end ----------------
Guest
Thu Sep 11, 2008 2:20 pm
On 11 Wrz, 11:29, Pawel K <gro...@kpw.qs.pl> wrote:
Quote:
plik z f-cjami inline kompiluje sie bezblednie jak widac:
Compiling C: dev/ads1110.c
[ciach]
Quote:
plik w ktorym wywoluje funkcje inline w trakcie kompilacji wywala takie
bledy:
include/dev/ads1110.h:6: warning: inline function 'ads1110_Convert_IN'
declared but never defined
To tylko ostrzeżenie, że funkcja nie będzie potraktowana jako inline i
rozwinięta w miejscu wywołania.
Wyjaśnij, po co deklarujesz funkcje jako inline, jeżeli nie dajesz
kompilatorowi możliwości skorzystania z tej deklaracji, definiując te
funkcje w oddzielnym pliku ".c" ?
Aby deklaracja inline mogła zadziałać, kompilator musi znać definicję
funkcji w miejscu, gdzie napotka do niej odwołanie. Przy programach
składających sie z wielu plików źródłowych, jedynym sensownym sposobem
jest umieszczenie definicji funkcji inline w pliku nagłówkowym i
najczęściej z dodatkowym atrybutem static (znaczy jako static inline),
aby później uniknąć problemów w czasie łączenia.
Wcześniejsza wersja kompilatora najwidoczniej nie potrafiła generować
ostrzeżeń tego rodzaju.
Adam Dybkowski
Guest
Thu Sep 11, 2008 8:18 pm
Pawel K pisze:
Quote:
include/dev/ads1110.h:5: warning: inline function 'ads1110_Convert'
declared but never defined
Wygląda tak, jakbyś zapomniał o "static".
Poprawnie powinno być w pliku .h na przykład:
static inline int funkcja (int param1)
{
return param1 * 5;
}
Jeżeli chcesz wymusić, aby funkcja zawsze była inline (normalnie może
się zdarzyć, że jakaś duża funkcja static inline wywoływana wiele razy
będzie umieszczona w kodzie tylko raz gdy optymalizujesz na zajętość
pamięci kodu), można dodać always_inline to w atrybutach funkcji.
--
Adam Dybkowski
http://dybkowski.net/
Uwaga: przed wysłaniem do mnie maila usuń cyfry z adresu.
Konop
Guest
Fri Sep 12, 2008 12:36 am
Quote:
Wygląda tak, jakbyś zapomniał o "static".
Poprawnie powinno być w pliku .h na przykład:
static inline int funkcja (int param1)
{
return param1 * 5;
}
Jeżeli chcesz wymusić, aby funkcja zawsze była inline (normalnie może
się zdarzyć, że jakaś duża funkcja static inline wywoływana wiele razy
będzie umieszczona w kodzie tylko raz gdy optymalizujesz na zajętość
pamięci kodu), można dodać always_inline to w atrybutach funkcji.
A mógłbyś jeszcze tak w 3 słowach wyjaśnić, co oznacza static dla
funkcji inline?? Bo co dla zmiennej lokalnej - to wiem

... ma stałe
miejsce w RAMie... a dla funkcji - już nie :/...
Pozdrawiam
Konop
Artur M. Piwko
Guest
Fri Sep 12, 2008 10:01 am
In the darkest hour on Fri, 12 Sep 2008 01:36:32 +0200,
Konop <konoppo@gazeta.pl> screamed:
Quote:
Jeżeli chcesz wymusić, aby funkcja zawsze była inline (normalnie może
się zdarzyć, że jakaś duża funkcja static inline wywoływana wiele razy
będzie umieszczona w kodzie tylko raz gdy optymalizujesz na zajętość
pamięci kodu), można dodać always_inline to w atrybutach funkcji.
A mógłbyś jeszcze tak w 3 słowach wyjaśnić, co oznacza static dla
funkcji inline?? Bo co dla zmiennej lokalnej - to wiem

... ma stałe
miejsce w RAMie... a dla funkcji - już nie :/...
http://www.greenend.org.uk/rjk/2003/03/inline.html
--
[ Artur M. Piwko : Pipen : AMP29-RIPE : RLU:100918 : From == Trap! : SIG:227B ]
[ 09:01:20 user up 11828 days, 20:56, 1 user, load average: 0.99, 0.71, 0.72 ]
Minds are like Parachutes. They work best when open.