GRRRR GCC, PIC32 Varning vid kompilering

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46978
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

GRRRR GCC, PIC32 Varning vid kompilering

Inlägg av TomasL »

Får följande varning vid kompilering, kan inte begripa varför

Kod: Markera allt

warning: incompatible implicit declaration of built-in function 'memset'
Anropet ser ut så här:

Kod: Markera allt

memset( pxNewTCB->pxStack, ( int ) tskSTACK_FILL_BYTE, ( size_t ) usStackDepth * sizeof( portSTACK_TYPE ) );
string.h är inkluderad.
Vad jag kan se så följer anropet boken.
memset är definierad i string.h som

Kod: Markera allt

extern void * memset(void *, int, size_t);
Senast redigerad av TomasL 17 januari 2013, 12:03:29, redigerad totalt 1 gång.
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Re: PIC32 Varning vid kompilering

Inlägg av dangraf »

hej!
har du testat sätta parentes runt hela uttrycken vid casting, (int) (a*b) ibland tar castingen bara första uttrycket dvs att (int) a * b konverterar a till en int men att hela uttrycket blir av typen long.

Har du testat att se om andra funktioner i string.h fungerar som de ska? tänkte om kompilatorn kanske hittar header-filen men att libet saknas.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC32 Varning vid kompilering

Inlägg av sodjan »

Så här har jag förstått...

Om man använder en funktion som inte är deklarerad (i samma kod eller via
en header fil) så får man "warning: implicit declaration" och returvärdet
blir default "int". Om man accepterar varningen så är det helt OK, annars
importerar man en lämplig header fil eller lägger till en egen deklaration.

Vissa funktioner kan ha en intern deklaration i själva kompilatorn, och
om den inte stämmer överen med den automatgenererade så får man
"warning: incompatible implicit declaration". T.ex ifall memset()
internt är definierad som void.

Kör en full listfil och verifiera att string.h är korrekt importerad.
Du kan även testa att kopiera raden från string.h till din c fil.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46978
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: PIC32 Varning vid kompilering

Inlägg av TomasL »

Det visade sig vara en i gcc inbyggd funktion, vars deklaration inte stämmer med gängse vedertaget sätt, en kompilatorswitch fixade det.
Men varför i helsike gör man inte så att inbyggda funktioner är definierade som "weak", då slipper man alla problem.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC32 Varning vid kompilering

Inlägg av sodjan »

Hade det inte också "lösts" om du hade anropat memset()
på så sätt som GCC förväntade sig?
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46978
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: PIC32 Varning vid kompilering

Inlägg av TomasL »

Nja, gillar inte att använda "odokumenterade" funktioner, anser att man skall använda libben i stället, man har liksom lite större kontroll på saker och ting.
Personligen så anser jag att sådana Built-in funktioner skall vara "weak", så man utan problem kan ersätta dem rakt av med en include, utan att behöva ändra i kod.
dessutom vill man ju gärna att koden skall vara porterbar och sann ansi, vilket den inte blir om kompilatorn har egna inbyggda funktioner, vilka skiljer sig från ansi-liben.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC32 Varning vid kompilering

Inlägg av sodjan »

Jag tog det som självklart att memset() är/var dokumenterad!
*Det* har ju inget med hur den är implementerad...

Portabiliteten håller jag med om, så länge som inbygda
funktioner inte ingår i standarden som sådan (som tex i Fortran).
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46978
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: GRRRR GCC, PIC32 Varning vid kompilering

Inlägg av TomasL »

I ansiliben är memset deklarerad som en "void *" i gcc verkar det bara vara en "void".
Det är säkert dokumenterat in någon kryptisk obskyr dokumentation någonstans.

Men oavsett vilket så bryter sådana här egenheter portabiliteten, och som sagt den borde vara weak, så om man inkluderar ett libb med motsvarande funktioner, så skall det överrida de interna funktionerna.
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Re: GRRRR GCC, PIC32 Varning vid kompilering

Inlägg av dangraf »

Men om man deklarerar den som weak, då finns den väl där alltid även om man glömt lägga till sitt lib
In computing, a weak symbol is a symbol definition in an object file or dynamic library that may be overridden by other symbol definitions. Its value will be zero if no definition is found by the loader.
Då kan man av misstag kalla på funktioner som inte finns vilket kan vara ganska farligt.

Eller har jag missförstått?
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46978
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: GRRRR GCC, PIC32 Varning vid kompilering

Inlägg av TomasL »

Finns inte funktionerna deklarerade får du felmeddelande, finns de deklarerade men du anropar dem med fel typer, som i mitt fall får du en varning/felmeddelande beroende på inställning.
Så som jag uppfattat det, om den är deklarerad som weak, och jag inkluderar ett lib, så överrider libbet den svagt deklarerade symbolen, i detta fallet de inbyggda funktionerna eftersom jag inkluderade libben i stället.
Nåväl, med en kompilatorswitch kan man stänga av de inbyggda funktionerna, så det löste sig. Ingen blå text längre.
Skriv svar