Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Uknow en 26 Junio 2013, 06:27 am



Título: ¿Qué es el estándar en C?
Publicado por: Uknow en 26 Junio 2013, 06:27 am
Parece tonta la pregunta pero no lo tengo claro, ¿qué se considera compilar un código por medio del estándar? ¿que el código sólamente incluya las librerías que se encuentran aquí (http://es.wikipedia.org/wiki/Biblioteca_est%C3%A1ndar_de_C#Archivos_de_cabeceras_de_la_biblioteca_ANSI_C) ? ¿cómo sé cuándo compilo rigiéndome por el estandar? ¿cuando le agrego al compilador la opción -ansi?

y otra duda aparte, cuando escribo un código (q imprima un número y use getch() para parar) sin incluir ninguna libería, ¿por qué compila? ¿por la rtl? y si es así, ¿cómo sé cuáles funciones tiene la rtl y cuáles no? uso mingw en windows.

ah! también, ¿es posible tener un ejecutable q no cargue kernel32 ni ntdll ?

Gracias.

saludos.


Título: Re: ¿Qué es el estándar en C?
Publicado por: pacoperico en 26 Junio 2013, 21:47 pm
El lenguaje C es un lenguaje estandarizado es decir, hay un organismo oficial que supervisa el lenguaje y establece cuales son los elementos y las reglas que ha de contener el lenguaje C para que se le considere "c estandar" o "ansi c" que son lo mismo.

Para que podamos decir que un determinado programa compilador es un "compilador de C" ha de ser capaz de compilar un archivo de codigo fuente escrito segun las reglas del lenguaje C estandar.

A la hora de compilar tu programa con gcc añade esta opcion:
Código:
-std=c99
Esto significa que la compilacion se hara conforme al estandar, en este caso sera segun el estandar c99.

No es logico que puedas compilar un programa usando la funcion getch() sin incluir la cabecera, de forma predeterminada gcc te lo compila sin problemas. Intenta compilarlo con la opcion de -std=c99 y veras como en este caso te dara errores de compilacion ya que segun el estandar para usar una funcion hay que hacer un #include al archivo de cabecera.

Ejcutables los hay de mil maneras y mil colores, depende del compilador que estes usando. Si estas en una maquina linux seguro que tu ejecutable no va a hacer uso de kernel32 ni ntdll. Si usas un compilador que crea ejecutables de 16 bits como el turbo c de borland, no hara uso de kernel32 pero si usara algun otro programa o dll a moso de emulador, para poder correr un ejecutable de 16 bits en una maquina de 32.


Título: Re: ¿Qué es el estándar en C?
Publicado por: Uknow en 27 Junio 2013, 00:39 am
Según tengo entendido el include lo único que hace es especificar los prototipos de las funciones que se encuentran dentro d la librería. Si compilas esto en windows con gcc, tienes lo siguiente:
Código
  1. #define PI 3.14
  2.  
  3. int main (void)
  4. {
  5.        printf("hi, %f\r\n", PI);
  6.        getch();
  7.        return 0;
  8. }
  9.  
Código:
gcc x.c -o x.exe -std=c99

Me da dos warnings d declaraciones implicitas por no haber incluído nada pero compila d lo más bien.

Si dices que para que un compilador compile regido por el estándar se le debe agregar la opción -std no entiendo porqué compila teniendo la función getch el código. La opción que veo es que hayan liberías que se incluyan por defectos en donde esté la función getch, pero ¿por qué se incluirían esas librerías si coloco la opción -std=c99? es lo que no entiendo.

Gracias por responder,

saludos.


Título: Re: ¿Qué es el estándar en C?
Publicado por: rir3760 en 27 Junio 2013, 03:04 am
Compilando tu programa con CygMing (la versión de gcc 4.5.3 para el entorno Cygwin) se presentan las dos advertencias y no se genera el ejecutable.

¿Que versión de gcc estas utilizando?

Un saludo


Título: Re: ¿Qué es el estándar en C?
Publicado por: Uknow en 27 Junio 2013, 03:13 am
gcc version 3.4.2 (mingw-special)

Yo sigo sin entender por qué influye en nada la versión o el compilador que se use, no se supone que si se especifíca que se desesa compilar rigiéndose por el estándar el compilador debe tomar la configuración correspondiente y hacerlo? :l

saludos.


Título: Re: ¿Qué es el estándar en C?
Publicado por: pacoperico en 27 Junio 2013, 04:13 am
Eso ya es un tema de compiladores, a mi con el compilador de visual studio no me crea el ejecutable y con el cygwin parece que tampoco lo permite.

Si la version que tienes de gcc te crea el ejecutable eso ya es un tema interno de gcc.   Seguramente sea cosa del linker, a lo mejor cuando encuentra una funcion que no ha sido definida, de modo predeterminado el enlazador la busca en la libreria que trae consigo gcc.

Eso ya que algun compañero del foro que conozca gcc a fondo lo confirme o no, o mirarlo en el foro de gcc.


Título: Re: ¿Qué es el estándar en C?
Publicado por: 0xDani en 29 Junio 2013, 20:41 pm
 GCC te dará un warning de declaración implícita, al no tener un prototipo con el que trabajar y señalarte si le faltan o sobran argumentos a una función, generará código objeto con referencias a las funciones que llames, y se lo pasará al linker.

 Si el linker encuentra la función, como parece hacer en este caso, porque enlace tu ejecutable con alguna librería por defecto, pues no te lanzará ningún error.

Saludos.