2010-11-24 8 views

Respuesta

30

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).

+0

oh ok es como la interfaz en Java, sería mejor si C se pudiera hacer como Java – anshulkatta

+0

es posible que desee echar un vistazo a C++/C# – Wreigh

12

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.

+1

Gracias por la gran explicación: D –

+0

@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í. –

Cuestiones relacionadas