2011-01-10 18 views
5

Ich habe die folgenden Programme ohne #include <ctype.h> geschrieben. Ich kann das Programm ausführen. Wo werden diese Prototypen deklariert? Ich benutze gcc.Ohne include #include <ctype.h>

1.

#include <stdio.h> 
int main() 
{ 
    if(isalnum(';')) 
     printf("character ; is not alphanumeric"); 
    if(isalnum('A')) 
     printf("character A is alphanumeric "); 
    return 0; 
} 

2.

#include <stdio.h> 
int main() 
{ 
    printf("Lower case of A is %c \n", tolower('A')); 
    printf("Lower case of 9 is %c \n", tolower('9')); 
    printf("Lower case of g is %c \n", tolower('g')); 
    printf("ASCII value of B is %d \n", toascii('B')); 
    printf("Upper case of g is %c \n", toupper('g')); 
    return 0; 
} 
+0

versuchen, ungültige Argumente zu übergeben, der Compiler könnte den Ort ausgeben, an dem der Prototyp deklariert ist. – XAder

+0

Welchen Compiler benutzen Sie? Welche Version von C? –

+1

'if (isalnum (';')) printf (" ist nicht alphanumerisch ");'? Bist du sicher? – Benoit

Antwort

8
  1. In Ihrem Code sind diese Funktionen implizit deklariert, so dass sie nicht von einem bestimmten Header enthalten. Wenn Sie Warnstufe für Ihren Compiler aufdrehen, werden Sie (zum Beispiel GCC) sehen:

    $ gcc -Wall -o a.c 
    a.c: In function ‘main’: 
    a.c:4: warning: implicit declaration of function ‘isalnum’ 
    

    Wenn die Definition der Funktion nicht verfügbar ist, nimmt der Compiler ist i eine Funktion eine beliebige Anzahl von Argumenten nimmt und die Rückkehr int. Zum Beispiel kann die folgende compiliert:

    main(){fgetc(1,2,3,4,5);} 
    
  2. Da, wo sie sollte deklariert wird, ist es die <ctype.h>-Header. Natürlich können verschiedene C-Implementierungen diesen Header auch in anderen Headern enthalten. Daher scheint der Code ohne Berücksichtigung von <ctype.h> zu funktionieren. Wenn Sie jedoch Ihren Code ohne Warnungen für verschiedene C-Implementierungen kompilieren möchten, sollten Sie diesen Header einschließen.

+0

ich kompiliert mit gcc, aber ich habe keine Warnung bekommen ....... es funktioniert einwandfrei – venkat

+0

@venkat, versuchen 'gcc -Wall xc' –

+0

ja, ich bekomme Warnungen ....... Ohne Verwendung der Option "Wall" bekomme ich die richtige Antwort ... aber meine Frage ist, wo diese Proto-Typen anders deklariert sind als ctype.h – venkat

2

Eine Funktion muss nicht verwendet werden sollte erklärt werden (aber ich würde moderne C-Compiler erwartet eine Warnung in solchen Fällen geben), wenn sie mit dem richtigen Argumente verwendet wird. Es ist, als ob die Funktion hatte

int isalnum(); 

deklariert werden (und nicht

int isalnum(...); 

, die nicht C ist - braucht man mindestens ein mit dem Namen Paramater - und wenn es variadische Funktionen ist möglicherweise verwenden eine andere Aufrufkonvention als nichtvariable).

Dies ist nur möglich für die Funktion int zurückkehren und mit Parametern, die durch die Förderung nicht berührt werden (char und kurz durch Förderung berühren, Funktionen aus der Standardbibliothek sind oft in dieser Klasse aus historischen Gründen).

+0

ah technisch denke ich, du hast Recht, AProgramm .. Ich denke, der Punkt, den ich versuchte zu machen ist, dass eine beliebige Anzahl von Parametern an eine Funktion übergeben werden kann, weil der Code, der den Funktionsaufruf macht, für das Aufräumen des Stapels zuständig ist die aufgerufene Funktion. Danke, dass du das geklärt hast. –

+1

'int isalnum (...);' ist ungültig C: variadic Funktionen benötigen mindestens einen benannten Parameter – Christoph

+0

@Christophe, rechts. Das habe ich vergessen (es ist ein Unterschied zwischen C und C++ und ich mache mehr C++ als C - nicht, dass variadische Funktionen ohne benannte Parameter sehr nützlich sind, außerhalb von Vorlagentricks). Es war hauptsächlich eine Ergänzung aufgrund einer Antwort, die seitdem gelöscht wurde. – AProgrammer