Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » isblank

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
14.09.2006, 18:22 Uhr
Pablo
Supertux
(Operator)


Hi

ich hab ein seltsames Verhalten mit isblank entdeckt. Ich hab eine Funktion mit einem Funktionszeiger, aber wenn ich nicht kompilieren, wenn ich isblank benutze:


C++:
#include <stdio.h>
#include <ctype.h>

void foo(int (*blank)(int))
{
        printf("blank = %d\n", blank(' '));
}

int main(void)
{
        foo(isblank);
        return 0;
}



wenn ich kompiliere bekomme:


bash:

supertux@supertux:~> gcc test.c -o /dev/null
test.c: In function 'main':
test.c:11: error: 'isblank' undeclared (first use in this function)
test.c:11: error: (Each undeclared identifier is reported only once
test.c:11: error: for each function it appears in.)



Wenn ich isblank durch isdigit oder eine andere is* Funktion ersetze, dann wird alles kompiliert. Wenn ich ein isdigit(0); vor dem Aufruf von foo schreibe, dann wird test.c erfolgreich kompiliert. Wieso denn das? Oder kann es an meiner glibc liegen?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
14.09.2006, 18:55 Uhr
0xdeadbeef
Gott
(Operator)


isblank ist erst in C99 enthalten. Gib gcc den Parameter -std=c99 mit, dann sollte es gehen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
14.09.2006, 19:31 Uhr
Pablo
Supertux
(Operator)


Tatsächlich, aber wieso geht es so?


C++:
int main(void)
{
        blank(0);
        foo(isblank);
        return 0;
}


--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
14.09.2006, 19:44 Uhr
0xdeadbeef
Gott
(Operator)


Wenn du, wie ich vermute,

C++:
int main(void)
{
        isblank(0);
        foo(isblank);
        return 0;
}


meinst, der erste Aufruf von isblank deklariert implizit eine Funktion int isblank(int), weswegen die dann beim Aufruf von foo(isblank) bekannt ist. Sowas geht nur in C89 und ist höchst unschön, aber da geht es eben. Linkerfehler gibts nachher nicht, weil der Linker isblank ja in der libc6.so findet.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
14.09.2006, 20:19 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Man kann eine Funktion innerhalb einer anderen deklarieren?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
14.09.2006, 21:21 Uhr
Pablo
Supertux
(Operator)



Zitat von 0xdeadbeef:
Wenn du, wie ich vermute,

C++:
int main(void)
{
        isblank(0);
        foo(isblank);
        return 0;
}


meinst, der erste Aufruf von isblank deklariert implizit eine Funktion int isblank(int), weswegen die dann beim Aufruf von foo(isblank) bekannt ist. Sowas geht nur in C89 und ist höchst unschön, aber da geht es eben. Linkerfehler gibts nachher nicht, weil der Linker isblank ja in der libc6.so findet.


das hab ich mir schon gedacht, war aber nicht so sicher.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
15.09.2006, 09:00 Uhr
ao

(Operator)



Zitat von Guybrush Threepwood:
Man kann eine Funktion innerhalb einer anderen deklarieren?

Deklarieren (Prototyp) ja, definieren (Implementierung) nein.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
15.09.2006, 09:34 Uhr
stephanw
localhorst


Aber wieso ist

C++:
isblank(0);


eine Funktionsdeklaration ? Fehlt der Rückgabetyp und das Argument ist kein Typ, sondern ein Wert.
Ich dachte, nur das

C++:
bool isblank(char);


ist eine Deklaration.
--
Reden ist Schweigen und Silber ist Gold.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
15.09.2006, 10:23 Uhr
0xdeadbeef
Gott
(Operator)


Die Deklaration dürfte dir den Stack zertrümmern, denn in der libc ist

C++:
int isblank(int);


definiert. Wie dem auch sei, was du da vor dir hast, ist eine implizite Funktionsdeklaration, wie sie C89 kennt. Möglicherweise sind dir schonmal Compilerwarnungen über den Weg gelaufen, die in etwa "Warning: implicit declaration of ..." lauteten, was meistens auf vergessene Header hindeutet. Was da passiert ist, dass du eine undeklarierte Funktion benutzt und der Compiler sich aus dem Aufruf eine Deklaration zusammenreimt.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
15.09.2006, 16:29 Uhr
stephanw
localhorst


Ich wollte nicht isblank neu definieren, ich kannte nur gerade die Signatur nicht, sollte nur ein Beispiel sein. Dass der aus "isblank(0)" implizit eine Deklaration versucht abzuleiten, ist mir neu, ist aber tatsächlich unschön. Wenn es nur in C89 geht, geht es nicht in einigermaßen aktuellem C++ ? Das wäre schön ;-)
--
Reden ist Schweigen und Silber ist Gold.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: