[Megoldva] C: incompatible implicit declaration

 ( pelz | 2009. január 17., szombat - 18:48 )

Sziasztok!

Egy figyelmeztetést kapok a gcc-től, amit nem értek. A kód ez lenne:

	char str[] = "xyz";
	size_t len;

	len = strlen(str);

Az utolsó sorra ezt az üzenetet kapom:

Idézet:
warning: incompatible implicit declaration of built-in function 'strlen'

Szerintetek, miért van?
A dokumentációm alapján az strlen() függvény size_t típust ad vissza. A program működik, de miért ír ilyen figyelmeztetést?

gcc version 4.2.4 (Ubuntu 4.2.4-1ubuntu3)

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Az '#include <string.h>' sor kimaradt a forrásból.

A fenébe! Tényleg.

De akkor miért működik a program? Miért csak figyelmeztetést kapok? Miért nem hibát?

mert a fordító implicit deklarálja 'int strlen();' módon
Az ANSI C-ben nem kötelező megadni a deklarációban a paraméterek típusát, elég ha a nevét és a visszatérési értékét tudja a fordító, a függvény meghívójáé a feleősség hogy jól paraméterezze a függvényt (jó paraméterek kerüljenek a stack-re)
Aztán a standard C library-ban a linker meg is találja az strlen nevű függvényt, és boldogan használja.

Ha hibás működést akarsz látni:
Próbáld ki mondjuk az sqrt függvényt math.h include-olás nélkül, a visszatérési értéket int-nek fogja venni a fordító miközben az erdemény double.

Pontosítsatok bátran!

Köszönöm a felvilágosítást!

"built-in" reszt nem vetted figyelembe.
Ezek specialisan kezelt fuggvenyek, ezekrol tudni fogja mik.
pl. sqrt(costans) eseten , mar a vegeredmenyt teszi a kodba a gcc.

Regen valoban azt tette amit te mondasz.


Amit nem lehet megirni assemblyben, azt nem lehet megirni.

Elvben akkor is el kellene engedjen egy warningot.
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

tmp # gcc -Wall -c cucc.c -o cucc.o
cucc.c: In function ‘cucc’:
cucc.c:3: warning: implicit declaration of function ‘bize’
tmp # cat cucc.c
void cucc(int a)
{
bize(a);
}
tmp # gcc -c cucc.c -o cucc.o
tmp #


Amit nem lehet megirni assemblyben, azt nem lehet megirni.

Latod, ezert kell mindent -Wall -lal forditani fejleszteskor. Ez alap. (sot, en meg a -pedantic kapcsolot is berakom)
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Megfontolom én is.