
María
Tengo los siguientes dos archivos:
archivo1.c
int main(){
foo();
return 0;
}
archivo2.c
void foo(){
}
¿Puedo compilar y vincular los dos archivos para que el file1.c
reconocerá el foo
función sin agregar extern
?
Actualizado el prototipo.
gcc archivo1.c archivo2.c arroja: advertencia: declaración implícita de la función foo.

Sangeeth Saravanaraj
La forma correcta es la siguiente:
file1.c
#include <stdio.h>
#include "file2.h"
int main(void){
printf("%s:%s:%d \n", __FILE__, __FUNCTION__, __LINE__);
foo();
return 0;
}
file2.h
void foo(void);
file2.c
#include <stdio.h>
#include "file2.h"
void foo(void) {
printf("%s:%s:%d \n", __FILE__, __func__, __LINE__);
return;
}
output
$
$ gcc file1.c file2.c -o file -Wall
$
$ ./file
file1.c:main:6
file2.c:foo:6
$

chrisaycock
no necesitas un extern
pero file1.c debe ver una declaración que foo()
existe Por lo general, esta declaración se encuentra en un archivo de encabezado.
Para agregar una declaración de reenvío sin usar un archivo de encabezado, simplemente modifique file1.c para:
int foo(); // add this declaration
int main(){
foo();
return 0;
}

pablo r
Tú latapero no deberías.
Use un archivo de encabezado, file2.h:
// file2.h
void foo(); // prototype for function foo()
Luego añade:
#include "file2.h"
en archivo1.c
Compilar:
$ gcc -Wall file1.c file2.c -o foo
Como regla general, es mejor (más robusto) usar un archivo de encabezado para definir el interfaz de cada módulo en vez de ad hoc prototipos dentro de módulos dependientes. Esto a veces se conoce como el principio SPOT (Single Point Of Truth).
Es feo, pero usando gcc, podrías:
gcc -include file2.c file1.c
-include
es una bandera para el preprocesador que incluirá el contenido de file2.c en la parte superior de file1.c. Habiendo dicho eso, es una mala elección y se descompone en todos los programas, excepto en los más simples.
gcc file1.c file2.c
tampoco conozco las reglas exactas de C para las llamadas a funciones cuando no se ve un prototipo, pero es posible que deba agregarint foo();
encimamain
– Seth Carnegie
4 de enero de 2012 a las 14:48
@Seth: por favor siempre -incluye
-Wall
al dar ejemplos de gcc, ayuda a que los novatos adquieran buenos hábitos.– Pablo R.
4 de enero de 2012 a las 14:54
Actualicé la pregunta. Lo hago con -Wall.
– María
4 de enero de 2012 a las 14:55