Digamos que defino una función en el archivo func1.c
, y quiero llamarlo desde el archivo call.c
, ¿cómo puedo lograr esto? ¡Gracias por adelantado!¿Cómo puedo definir una función C en un archivo y luego llamarlo desde otro?
Respuesta
Debería poner una declaración para la función en el archivo func1.h
, y agregar #include "func1.h"
en call.c
. Luego, compilaría o vincularía func1.c
y call.c
(los detalles dependen del sistema C).
Utilice un Forward Declaration
Por ejemplo:
typedef struct
{
int SomeMemberValue;
char* SomeOtherMemberValue;
} SomeStruct;
int SomeReferencedFunction(int someValue, SomeStruct someStructValue);
int SomeFunction()
{
SomeStruct s;
s.SomeMemberValue = 12;
s.SomeOtherMemberValue = "test string";
return SomeReferencedFunction(5, s) > 12;
}
Hay una característica que le permite volver a utilizar estas declaraciones adelantadas llamados Header Files. Basta con tomar las declaraciones adelantadas, colocarlos en el archivo de cabecera, a continuación, utilizar #include
para añadirlos a cada archivo fuente de C se hace referencia a las declaraciones adelantadas en.
/* SomeFunction.c */
#include "SomeReferencedFunction.h"
int SomeFunction()
{
SomeStruct s;
s.SomeMemberValue = 12;
s.SomeOtherMemberValue = "test string";
return SomeReferencedFunction(5, s) > 12;
}
/* SomeReferencedFunction.h */
typedef SomeStruct
{
int SomeMemberValue;
char* SomeOtherMemberValue;
} SomeStruct;
int SomeReferencedFunction(int someValue, SomeStruct someStructValue);
/* SomeReferencedFunction.c */
/* Need to include SomeReferencedFunction.h, so we have the definition for SomeStruct */
#include "SomeReferencedFunction.h"
int SomeReferencedFunction(int someValue, SomeStruct someStructValue)
{
if(someStructValue.SomeOtherMemberValue == NULL)
return 0;
return someValue * 12 + someStructValue.SomeMemberValue;
}
Por supuesto, para poder compilar los dos archivos de origen, y, por lo tanto, toda la biblioteca o el programa ejecutable, deberá agregar el resultado de ambos archivos .c a la línea de comando del enlazador, o incluirlos en el mismo "proyecto" (dependiendo de su IDE/compilador).
Muchas personas sugieren que cree archivos de encabezado para todas sus declaraciones de reenvío, incluso si no cree que las necesitará. Cuando usted (u otras personas) vayan a modificar su código, y cambien la firma de funciones, les ahorrará tiempo de tener que modificar todos los lugares donde la función se declara hacia adelante. También puede ayudarlo a salvarse de algunos errores sutiles, o al menos confundir los errores del compilador.
Gracias por la gran explicación: D –
@Sam H: También tenga en cuenta que puede tener la declaración directa y la definición real en el mismo archivo fuente. Todavía funcionará. Esto es útil para fines de organización del código, por lo que no * tiene * para escribir sus funciones en el orden en que se utilizan. También es útil cuando tienes dos funciones que se llaman entre sí. –
- 1. Incrustar un dll dentro de otro como un recurso incrustado y luego llamarlo desde mi código
- 2. Haciendo DLL Fortran y llamarlo desde C#
- 3. ¿Se debe definir una función Javascript antes de llamarlo?
- 4. Pasar un Objeto de Función y Llamarlo
- 5. Cómo llamar a una función desde otro archivo de clase
- 6. ¿Cómo puedo definir una función en Clojure?
- 7. ¿Cómo puedo definir y usar un ENUM en Objective-C?
- 8. ¿Puedo cargar un archivo .gitconfig desde otro?
- 9. Javascript: función de llamada desde otro archivo
- 10. Convertir el puntero del método a entero, y luego llamarlo
- 11. Cómo reanudar una actividad al llamarlo desde un Intento
- 12. importando clase y su función desde otro archivo
- 13. ¿Cómo puedo crear, escribir y luego devolver un archivo en C# sin guardarlo en el disco?
- 14. ¿Llamar a una función en un archivo Javascript desde otro archivo Javascript?
- 15. ¿Cómo puedo definir condicionalmente una función en javascript?
- 16. ¿Cómo puedo crear una tabla en Lua y luego agregar valores desde la API de C?
- 17. Cómo puedo cargar y ejecutar un archivo lua desde otro archivo lua
- 18. ¿Puedo definir propiedades en clases parciales, y luego marcarlas con atributos en otra clase parcial?
- 19. Llamar a una función javascript desde otro archivo .js
- 20. ¿Cómo puedo definir constantes en un archivo separado en Perl?
- 21. ¿Cómo firmar un archivo y luego verificarlo?
- 22. ¿Cómo puedo compilar el código CUDA y luego vincularlo a un proyecto C++?
- 23. ¿Por qué puedo definir estructuras y clases dentro de una función en C++?
- 24. clasificar una lista por una propiedad y luego por otro
- 25. ¿Construyes un PyObject * desde una función C?
- 26. Cómo llamar a una función en un archivo CPP desde un archivo C y viceversa en ANDROID NDK?
- 27. ¿Cómo sobrescribir una función en otro archivo javascript?
- 28. ¿Dónde puedo definir el cuerpo para una función privada?
- 29. ¿Cómo llamar a la función de un archivo php de otro archivo php y pasarle parámetros?
- 30. pasar una función como un parámetro y luego ejecutarlo en una función jquery
oh ok es como la interfaz en Java, sería mejor si C se pudiera hacer como Java – anshulkatta
es posible que desee echar un vistazo a C++/C# – Wreigh