Hola Pau,<br><br><div class="gmail_quote">2010/10/31 Pau Marc Munoz Torres <span dir="ltr"><<a href="mailto:paumarc@gmail.com">paumarc@gmail.com</a>></span><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hola a todos!<br><br> Hoy me he liado con el  mundo de las bibliotecas, y hay un par de cosas que no entiendo:<br><br></blockquote><div><br>A ver si podemos aclarar las cosas.<br> </div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Segun tengo entendido se crean 2 archivos  para la biblioteca (.h y .c) mas el archivo que la va usar<br>
<br></blockquote><div><br>El archivo que va a usar la biblioteca es aparte; no tiene nada que ver con la creación de la biblioteca.<br><br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
ejemplos<br><br>sum.h<br><br>#ifndef _SUM_H_<br>#define _SUM_H_<br>int sum1(int a,int b);<br>#endif<br><br>sum.c<br><br>#include"sum.h"<br>int sum1(int a,int b) {<br>    return a+b;<br>}<br><br>primera pregunta en sum.h como se sabe cuantos guiones bajos se tienen q poner para el nombre de la biblioteca  en #ifndef i #define y pq no se pone </blockquote>
<div><br>Los subrayados (o guiones bajos) forman parte del nombre de la constante simbólica: "_SUM_H_". Puedes elegir cualquier nombre que quieras; con o sin subrayados. Por convenio, elegimos subrayados para tener nombres más distintivos.<br>
<br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">sum.h en vez de _SUM_H_ en majusculas<br>
<br></blockquote><div><br>"sum.h" es el nombre del fichero de cabecera que no tiene nada que ver con el nombre de la constante simbólica definida y usada por las directivas del precompilador (o preprocesador).<br>
<br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">segunda _SUM_H_ siempre va en majusculas?<br><br></blockquote><div><br>No siempre. Se trata de un nombre y por tanto, puede tener mayúsculas o minúsculas. Nuevamente, por convenio, se usan mayúsculas.<br>
<br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Tercera, que diferencia habria entre _SUM_H_ i __SUM_H?<br><br></blockquote><div><br>
La diferencia obvia es que el segundo nombre tiene un subrayado de más al principio. Puedes elegir cualquiera de los nombres, pero obviamente la lógica de las directivas del precompilador debe mantenerse. Esto es,<br><br>
#ifndef _SUM_H_<br>#define _SUM_H_<br><br>o si prefieres el otro nombre, entonces escribe:<br><br>#ifndef __SUM_H_<br>#define __SUM_H_<br><br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
cuarta: porque en sum.c se incuye sum.h ?<br><br></blockquote><div><br>La idea es separar las declaraciones de las definiciones (o implementaciones). En el fichero de cabecera, escribimos los prototipos de las funciones, y cualesquier otras declaraciones globales, mientras que en el fichero fuente escribimos las implementaciones de tales funciones. El compilador siempre compilará el fichero fuente, y no los ficheros de cabecera.<br>
<br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">pasemos  al ejecutable<br><br>test.c<br><br>#include<stdio.h><br>
#include"sum.h"<br>int main() {<br>    printf("3+4=%i\n",sum1(3,4));<br>    return 0;<br>},<br><br>Aqui se tiene q volver a incluir sum.h cuando ya lo habimos incluido en sum.c, porque? no hay otra forma mas logica? no se deberia incluir sum.c?<br>

<br></blockquote><div><br>El compilador compila - valga la redundancia - cada fichero fuente por separado. Como ya he mencionado, sólo compila ficheros fuente. El compilador no puede inferir qué ficheros de cabecera quieres usar ni tampoco sabe las entidades declaradas ni definidas en otros ficheros. Por esta razón, hay que #incluir el fichero de cabecera "sum.h" si queremos usar 'sum1()'. De lo contrario, el compilador te lanzará un error, porque no tiene la declaración de 'sum1()'.<br>
<br>Esto lo puedes ver claramente al #incluir <stdio.h>. ¿Por qué hay que #incluirlo? Es la misma razón, porque este fichero de cabecera contiene las declaraciones y posiblemente algunas definiciones que necesitamos usar.<br>
<br>No se incluye "sum.c", porque así no es como usamos una biblioteca. Si lo hacemos así, entonces no se trata de una biblioteca. En segundo lugar, pueder haber "colisiones" de nombres de "sum.c" y nuestro programa en "test.c". Algo que no es muy sencillo de solucionar.<br>
<br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">como se compila todo esto?<br><br></blockquote><div><br>La compilación, como ya he mencionado, es por cada fichero fuente independientemente de los demás ficheros fuente. Al terminar la compilación, el enlazador (linker, en inglés) es quien reúne todos los ficheros compilados (llamados ficheros objeto), bibliotecas, y posiblemente otros ficheros de otra índole para crear un fichero ejecutable o una biblioteca.<br>
<br>Como estás intentando crear una biblioteca, deberías haber creado un proyecto para crear bibliotecas. Usando los dos primeros ficheros: "sum.h" y "sum.c", construimos el proyecto. Esto implica que se compilará "sum.c", el cual #incluye "sum.h", creando un fichero objeto: "sum.o" o posiblemente "sum.obj". Posteriormente, el enlazador creará una biblioteca estática, que seguramente se llamará "libsum.a" o "sum.a", o incluso, "sum.lib". Este fichero ES la biblioteca.<br>
<br>Para USAR la biblioteca que acabas de crear, establece otro proyecto para crear un programa o una aplicación y escribe el programa que quieras. En tu ejemplo, el fichero fuente del programa es "test.c". Como quieres usar una biblioteca externa, "sum.lib", entonces debes indicar al enlazador que use esta biblioteca. Al construir el proyecto, se compila "test.c" (generando "test.obj"). Posteriormente, el enlazador tomará "test.obj", "sum.lib", y "stdlibc.lib" - o cual sea el nombre de las bibliotecas estándares, porque #incluiste <stdio.h> - generando el fichero ejecutable, "test.exe" o como se llame.<br>
<br>Sugiero que leas el artículo "Cómo crear y usar una biblioteca estática" en nuestra página para que te hagas una idea de la creación de una biblioteca y el uso de una biblioteca, en términos prácticos. El enlace es: <a href="http://c.conclase.net/devcpp/index.php?cap=libestatica">http://c.conclase.net/devcpp/index.php?cap=libestatica</a><br>
<br><br>Espero haber aclarado el asunto.<br><br>Steven<br><br> </div></div>