2011-01-10 10 views
5

He escrito los programas a continuación sin incluir #include <ctype.h>. Puedo ejecutar el programa. ¿Dónde se declaran estos prototipos? Estoy usando gcc.Sin incluir #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

intenta pasar argumentos no válidos, el compilador puede mostrar el lugar donde se declara el prototipo. – XAder

+0

¿Qué compilador estás usando? ¿Qué versión de C? –

+1

'if (isalnum (';')) printf (" no es alfanumérico ");'? ¿Estás seguro? – Benoit

Respuesta

8
  1. En su código de estas funciones son declarado implícitamente, por lo que no se incluyen desde cualquier cabecera en particular. Si poner encima de nivel de advertencia para su compilador, se verá (GCC, por ejemplo):

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

    Si la definición de la función no está disponible, el compilador asume que una función de tomar cualquier número de argumentos y devolver int. Por ejemplo, los siguientes: compila

    main(){fgetc(1,2,3,4,5);} 
    
  2. En cuanto a dónde se deben ser declaradas, es la cabecera <ctype.h>. Por supuesto, diferentes implementaciones C pueden incluir este encabezado en otros encabezados, por lo que el código puede parecer que funciona sin incluir <ctype.h>, pero si desea que su código se compile sin advertencias en diferentes implementaciones C, debe incluir este encabezado.

+0

compilé con gcc, pero no recibí ninguna advertencia ... está funcionando correctamente – venkat

+0

@venkat, prueba 'gcc -Wall xc' –

+0

sí, estoy recibiendo advertencias ....... sin usar la opción Muro recibo la respuesta correcta ... pero mi pregunta es dónde se declaran estos tipos de proto distintos de ctype.h – venkat

2

Una función no tiene que ser declarado para ser utilizado (pero yo esperaría moderna compilador C para dar una advertencia en tales casos) si se utiliza con el argumento correcto. Es como si la función se había declarado

int isalnum(); 

(y no

int isalnum(...); 

que no es C - una necesidad por lo menos un parámetro de llamada - y si era variadic funciones pueden utilizar una convención de llamada diferente que una no variada).

Esto solo es posible para la función que devuelve int y que tiene parámetros que no son tocados por la promoción (las funciones de char de la biblioteca estándar a menudo se incluyen en esta clase por razones históricas).

+0

ah técnicamente, creo que tienes razón, AProgrammer .. Creo que el punto que estaba tratando de hacer es que cualquier número de parámetros se pueda pasar a una función porque el código que hace la llamada a la función es responsable de limpiar la pila, no la función llamada. Gracias por aclarar eso. –

+1

'int isalnum (...);' no es válido C: las funciones variadic necesitan al menos un parámetro con nombre – Christoph

+0

@Christophe, a la derecha. Se me olvidó eso (es una diferencia entre C y C++ y hago más C++ que C; no es muy útil esa función variadica sin el parámetro nombrado fuera de los trucos de la plantilla). Fue principalmente una adición debido a una respuesta que se ha eliminado desde entonces. – AProgrammer

Cuestiones relacionadas