2010-11-24 3 views

답변

30

func1.h 파일에 함수에 대한 선언을두고 #include "func1.h"call.c에 추가합니다. 그런 다음 func1.ccall.c을 함께 컴파일하거나 연결합니다 (자세한 내용은 C 시스템에 따라 다름).

+0

자바에서 인터페이스가 좋아, C가 Java처럼 만들어 질 수 있다면 더 좋을 것입니다. – anshulkatta

+0

C++/C# – Wreigh

12

사용하십시오 Forward Declaration

예를 들어

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; 
} 

당신이 Header Files라는이 앞으로 선언을 재사용 할 수있는 기능이 있습니다. 간단하게 당신이 전방 선언을 참조하는 각 C 소스 파일에 추가 #include를 사용 후, 헤더 파일에 배치, 전방 선언을. 물론

/* 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; 
} 

, 두 소스 파일을 컴파일 할 수 있도록, 따라서 전체 라이브러리 또는 실행 가능 프로그램의 경우 두 .c 파일의 출력을 링커 명령 행에 추가하거나 동일한 "프로젝트"(IDE/컴파일러에 따라 다름)에 포함시켜야합니다.

많은 사람들이 필요하다고 생각하지 않더라도 앞으로 선언에 대한 헤더 파일을 만들 것을 제안합니다. 개발자 (또는 다른 사람들)가 코드를 수정하고 함수의 서명을 변경하면 함수가 전달 선언 된 모든 장소를 수정하지 않아도됩니다. 또한 미묘한 버그 나 적어도 컴파일러 오류를 혼동하지 않도록 도와줍니다.

+1

을 고맙게 생각합니다. D –

+0

@Sam H : 메모 동일한 소스 파일에서 전방 선언과 실제 정의를 가질 수 있습니다. 여전히 작동 할 것입니다. 이는 코드 조직 목적에 도움이되므로 사용 순서에 따라 함수를 작성하지 않아도됩니다. 또한 서로 호출하는 두 가지 기능이있을 때 유용합니다. –

관련 문제