a continuación el programa dado funciona sin incluir <stdio.h>
? ¿Por qué funciona esto?sin incluir <stdio.h>
int main()
{
printf("integra");
return 0;
}
a continuación el programa dado funciona sin incluir <stdio.h>
? ¿Por qué funciona esto?sin incluir <stdio.h>
int main()
{
printf("integra");
return 0;
}
Algunos (¿viejos?) Compiladores no requieren prototipos antes de llamar a las funciones.
A menudo es legal usar funciones no declaradas en C (pero creo que no en este caso), pero no se recomienda . – Philipp
en un estándar anterior, la función no declarada asume int
argumento y valor de retorno. Su char*
tiene el mismo tamaño (32 bits) que int
, por lo que todo funciona.
Simplemente no lo hagas.
Hola, también está trabajando int main() { if (isalnum (';')) printf ("carácter; no es alfanumérico"); if (isalnum ('A')) printf ("el carácter A es alfanumérico"); return 0; } – venkat
dame una explicación clara – venkat
busca tu página man. 'isalpha()' es 'int isalpha (int)'. este partido es lo que dije. –
printf() sólo se define en libc.so
El enlazador dinámico resolverá el símbolo printf() en libc, ya que no se ha incluido
libc es por defecto en gcc para cada programa
El enlazador dinámico resolverá el símbolo de impresión ** incluso si tiene su declaración incluida **. (¡Piénsalo!) – user562374
Cuando utiliza una función que no ha sido declarada, el compilador asumirá que esta función devuelve un int
y toma un número no especificado, pero fijo, de argumentos.
Si esta suposición coincide con la definición de la función, y si los argumentos que proporcionó también coinciden (modulo las promociones del argumento predeterminado) con los parámetros que la función espera recibir, entonces todo está bien.
Si la suposición es incorrecta (como para printf
, que es una función variadica), o cuando los argumentos no coinciden, los resultados no están definidos. Una de las cosas desagradables del comportamiento indefinido es que puede parecer que funciona como se espera.
Como lo señaló Abi, su código se genera correctamente sin incluir stdio.h porque el enlazador se encuentra de forma predeterminada en la biblioteca estándar del sistema para el símbolo indefinido (printf
). GCC normalmente le advierte de tales casos.
Let TEST.C ser: test.c
1: int main()
2: {
3: printf("test\n");
4: return 0;
5: }
Edificio con GCC 4.2.1 en Mac OS X:
$ gcc test.c
test.c: In function ‘main’:
test.c:3: warning: incompatible implicit declaration of built-in function ‘printf’
$ ./a.out
test
puede desactivar esta vinculación predeterminado especificando una opción de GCC enlazador -nostdlib
(o -nodefaultlibs
) junto con -lgcc
(como el manual de GCC recomienda):
$ gcc -nostdlib -lgcc test.c
test.c: In function ‘main’:
test.c:3: warning: incompatible implicit declaration of built-in function ‘printf’
Undefined symbols:
"_puts", referenced from:
_main in cc3bvzuM.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
$
La definición de printf() está en libc.so y el enlazador dinámico se ocupará de ello incluso si no incluye el archivo de encabezado. Durante el tiempo de compilación, printf() será un símbolo indefinido y supone que puede encontrar la definición más adelante en libc. El archivo de encabezado simplemente dará el tipo de prototipo y suprimirá el compilador (advertencias) que establece que la definición del prototipo está presente en glibc. Básicamente, los archivos de encabezado se incluyen solo para garantizar que las definiciones estén disponibles en nuestras bibliotecas para ayudar al desarrollador.
"¿Por qué funciona esto?" no es una pregunta válida cuando has escrito código con un comportamiento indefinido. –
@R ..: ¿tal vez esa es una razón para suponer que venkat no se hizo esta pregunta él mismo, pero su maestro sí? – Bart
Posible duplicado de [¿Por qué #include es \ * no \ * requerido para usar printf()?] (Http: // stackoverflow.com/questions/336814/why-include-stdio-h-is-not-required-to-use-printf) –
vaxquis