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:
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)
- 2192 megtekintés
Hozzászólások
Az '#include <string.h>' sor kimaradt a forrásból.
- A hozzászóláshoz be kell jelentkezni
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?
- A hozzászóláshoz be kell jelentkezni
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!
- A hozzászóláshoz be kell jelentkezni
Köszönöm a felvilágosítást!
- A hozzászóláshoz be kell jelentkezni
"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.
- A hozzászóláshoz be kell jelentkezni
Elvben akkor is el kellene engedjen egy warningot.
--
()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Megfontolom én is.
- A hozzászóláshoz be kell jelentkezni