2011-01-10 15 views
5

Napisałem poniższe programy bez uwzględnienia #include <ctype.h>. Jestem w stanie wykonać program. Gdzie są deklarowane te prototypy? Używam gcc.Bez uwzględnienia #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

spróbuj przekazać nieprawidłowe argumenty, kompilator może wyprowadzić miejsce, gdzie deklarowany jest prototyp. – XAder

+0

Jakiego kompilatora używasz? Która wersja C? –

+1

'if (isalnum (';')) printf (" nie jest alfanumeryczny ");'? Jesteś pewny? – Benoit

Odpowiedz

8
  1. W kodzie te funkcje są niejawnie zadeklarowana, więc nie są one zawarte z danym cel. Jeśli podkręcić poziom ostrzegawczy dla kompilatora, można zobaczyć (na przykład GCC):

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

    Jeżeli definicja funkcji nie jest dostępna, kompilator zakłada, że ​​jest to funkcja biorąc dowolną liczbę argumentów i powrocie int. Dla przykładu, następujące kompiluje:

    main(){fgetc(1,2,3,4,5);} 
    
  2. na to, gdzie one powinny być zadeklarowane, to jest nagłówek <ctype.h>. Oczywiście różne implementacje C mogą zawierać ten nagłówek w innych nagłówkach, więc kod może wydawać się działać bez włączania <ctype.h>, ale jeśli chcesz, aby twój kod kompilował się bez ostrzeżeń w różnych implementacjach C, powinieneś dołączyć ten nagłówek.

+0

skompilowałem z gcc, ale nie otrzymałem żadnego ostrzeżenia ....... to działa poprawnie – venkat

+0

@venkat, spróbuj 'gcc -Wall xc' –

+0

tak, otrzymuję ostrzeżenia ....... bez użycia opcji Ściany otrzymuję poprawną odpowiedź ..... ale moje pytanie jest tam, gdzie te typy prototypów są zadeklarowane jako inne niż ctype.h – venkat

2

Funkcja nie musi być zadeklarowane do wykorzystania (ale będę oczekiwać nowoczesny kompilator C dać ostrzeżenie w takich przypadkach), jeżeli jest on stosowany z odpowiednim argumentem. To tak, jakby funkcja miał być zadeklarowane

int isalnum(); 

(i nie

int isalnum(...); 

który nie jest C - jeden potrzeba przynajmniej jeden nazwany paramater - i czy to funkcje o zmiennej liczbie argumentów może używać inna konwencja wywoływania niż konwencja non variadic).

Jest to możliwe tylko dla funkcji zwracającej i posiadającej parametry, które nie są dotykane przez promocję (char i short są dotykane przez promocję, funkcje z biblioteki standardowej często są w tej klasie z przyczyn historycznych).

+0

ah technicznie myślę, że masz rację, AProgrammer .. Sądzę, że punktem, który próbowałem zrobić, jest to, że dowolna liczba parametrów może być przekazana do funkcji, ponieważ kod wywołujący funkcję jest odpowiedzialny za wyczyszczenie stosu, nie nazwana funkcja. Dzięki za wyczyszczenie tego. –

+1

'int isalnum (...);' jest nieprawidłowe C: funkcje variadyczne wymagają co najmniej jednego nazwanego parametru – Christoph

+0

@ Christophe, z prawej. Zapomniałem o tym (jest to różnica między C i C++ i robię więcej C++ niż C - nie, że funkcja variadic bez nazwanego parametru jest bardzo użyteczna poza szablonowymi trikami). Był to głównie dodatek związany z odpowiedzią, która została usunięta od tamtej pory. – AProgrammer