2011-01-10 15 views
5

Ho scritto i seguenti programmi senza includere #include <ctype.h>. Sono in grado di eseguire il programma. Dove vengono dichiarati questi prototipi? Sto usando gcc.Senza includere #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

tenta di passare argomenti non validi, il compilatore potrebbe restituire il luogo in cui è stato dichiarato il prototipo. – XAder

+0

Che compilatore stai usando? Quale versione di C? –

+1

'if (isalnum (';')) printf (" non è alfanumerico ");'? Sei sicuro? – Benoit

risposta

8
  1. Nel codice queste funzioni sono implicitamente dichiarato, in modo che non sono compresi da ogni intestazione particolare. Se alzare il livello di allarme per il vostro compilatore, si vedrà (ad esempio GCC):

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

    Se la definizione della funzione non è disponibile, il compilatore assume i di una funzione di prendere qualsiasi numero di argomenti e di ritorno int. Ad esempio, i seguenti: compila

    main(){fgetc(1,2,3,4,5);} 
    
  2. quanto a dove dovrebbero essere dichiarati, è l'intestazione <ctype.h>. Naturalmente, diverse implementazioni C possono includere questa intestazione in altre intestazioni, quindi il codice potrebbe sembrare funzionare senza includere <ctype.h>, ma se si desidera che il codice venga compilato senza avvisi attraverso diverse implementazioni C, è necessario includere questa intestazione.

+0

ho compilato con gcc, ma non ho ricevuto alcun avviso ....... funziona correttamente – venkat

+0

@venkat, prova 'gcc -Wall xc' –

+0

sì, sto ricevendo avvisi ....... senza usare l'opzione Muro sto ricevendo risposta corretta ..... ma la mia domanda è dove questi tipi di proto sono dichiarati diversi da ctype.h – venkat

2

Una funzione non ha bisogno di essere dichiarate per essere usato (ma mi aspetto moderno compilatore C per dare un avvertimento in questi casi) se utilizzato con l'argomento corretto. E 'come se avesse la funzione di essere dichiarata

int isalnum(); 

(e non

int isalnum(...); 

che non è C - un bisogno di almeno uno di nome paramater - e se fosse funzioni variadic possono utilizzare una convenzione di chiamata diversa da quella non variata).

Questo è possibile solo per la funzione che restituisce int e con parametri che non vengono toccati dalla promozione (char e short vengono toccati dalla promozione, le funzioni dalla libreria standard spesso sono in questa classe per ragioni storiche).

+0

ah tecnicamente penso che tu abbia ragione, AProgrammer .. Immagino che il punto che stavo cercando di fare è che qualsiasi numero di parametri possa essere passato ad una funzione perché il codice che effettua la chiamata alla funzione è responsabile della pulizia dello stack, non la funzione chiamata. Grazie per averlo chiarito. –

+1

'int isalnum (...);' non è valido C: le funzioni variadic richiedono almeno un parametro denominato – Christoph

+0

@Christophe, a destra. Dimenticato (è una differenza tra C e C++ e faccio più C++ che C - non che la funzione variadica senza parametro nominato sia molto utile al di fuori dei trucchi dei template). Era principalmente un'aggiunta a causa di una risposta che è stata cancellata da allora. – AProgrammer

Problemi correlati