yosoy_bostero escribió:al finalizar al programacion si tenemos muchos .c con muchas funciones y .H con cabeceras como se linkea todo a la hora de compilar?
Primero, los h no tienen código y por tanto no se enlazan (que no "linkean"

). Son meras definiciones. Los .c se pasan cada uno a .o por parte primero del compilador (que pasa de C a ensamblador) y luego por parte del ensamblador (que pasa de ensamblador a código máquina). Estos .o son ficheros binarios pero aún mantienen "símbolos", lo que se denomina código objeto. Estos "símbolos" son marcas que le permiten al enlazador reconocer las referencias cruzadas entre unos .c y otros, y saber cómo mezclar todos los .o en un sólo fichero de código objeto, y si hay suerte no habrá más símbolos que resolver, con lo que la compilación habría terminado.
yosoy_bostero escribió:que es un .o? que funcion tiene?
Supongo que te la he respondido arriba

Cualquier duda me dices.
yosoy_bostero escribió:Cual es el uso practico del IFDEF y IFNDEF ? no logro entenderlo, que errores se evitan?
Bueno, en sí no evitan ningún error. Son directivas de preprocesador, que es un programa que se pasa sobre el código fuente antes de la compilación. El preprocesador prepara el código fuente para ser compilado. Esto supone sustituír los .h por los ficheros propiamente dichos (sí, se cambia el #include <stdio.h> por el fichero
stdio.h enterito), entre otras muchas cosas que se le pueden indicar (los # son órdenes de preprocesador).
Imagina ahora esta situación: tengo un fichero a.h que tiene un
#include <b.h>, mientras que b.h tiene un
#include <a.h>. Aquí el preprocesador como puedes comprobar nunca acabará de incluir uno en otro porque tienen una referencia circular.
Esto se puede solucionar de varias maneras, siendo la más común usar la directiva
#ifndef. En
b.h nada más empezar el fichero, preguntamos por un símbolo que indique que el fichero ya ha sido incluido, con #
ifndef B_H, por ejemplo. Esto pregunta si B_H ha sido definido. En caso de no haber sido definido, lo definimos con
#define B_H. Ahora si hay una referencia circular, no se volverá a incluir el contenido del fichero b.h porque el símbolo B_H está definido e
#ifndef B_H devolverá falso al preprocesador, que se saltará el fichero. Espero haberme explicado y no haberte liado aún más
yosoy_bostero escribió:que problema hay en trabajar con metodos/atributos de clase, cuando se tiene una clase que no sera instanciada (o lo sera solo una vez)?
Las clases no instanciadas ("estáticas" en su nombre técnico) no pueden crear diferentes objetos con diferentes valores. Siempre hay una sola. En el caso que nos ocupa del emulador, posiblemente se puedan trabajar con clases estáticas, esto se puede discutir en el hilo de diseño del software. Personalmente no me gustan porque no se pueden ni crear ni destruir, por tanto siempre ocupan memoria, y para un emulador hay muchos componentes que a lo mejor no necesitan estar ocupando memoria todo el rato (por ejemplo el lector de UMDs).
yosoy_bostero escribió:si m0skit0 me puede dar su opinion sobre las diferencias en desarrollar en C para linux y para Windows
Linux sigue prácticamente todos los estándares de programación internacionales, incluídos POSIX, ANSI C, TCP/IP, WWW, etc... Es un SO con una muy alta aceptación de los estándares internacionales.
Sin embargo Windows es posiblemente uno de los SOs con menos aceptación de los estándares internacionales, ya que M$ siempre los "adapta" a lo que ellos consideran que es lo mejor, lo que casi siempre suele redundar en incompatibilidades. El objetivo confeso (ver
Adoptar, extender y extinguir, ojo con Wikipedia en español que está censurada

) de M$ con estas prácticas es sustituír los estándares internacionales con los suyos propios, en una clara estrategia de monopolio agresivo.
Saludos.