2011-08-31 8 views
1

API에 몇 가지 추가 기능을 추가하려고합니다. 그러나 이러한 추가 기능을 외부 라이브러리에 포함하고 원본 라이브러리의 코드와 섞어 놓지 마십시오.C에서 API를 유연하고 눈에 거슬리지 않게 확장하기

내 함수에서 언급 한 API의 정적 함수에 액세스해야 할 때 문제가 발생합니다. 물론 내가 볼 수있는 유일한 해결책은이 함수의 코드를 내 API에 복사하거나 원래 API에서 정적이 아닌 API로 만드는 것입니다. 분명한 이유 때문에 두 가지 모두 나에게 좋은 옵션이 아닙니다.

더 정확하게 :

original_api.c 
    void some_function() -> uses some_helper_function() 
    static some_helper_function() 

my_api_extension.c 
    void some_extended_function() -> needs to use some_helper_function from original_api.c, but can't 

당신이 제안 할 수이 처리하는 가장 유연한 방법이 될 것이다?

저는 C와 관련이 있다는 것을 지적하고 싶습니다. C++가 아닙니다.

+0

은 정말 더러워지고있어. 내가 볼 수있는 유일한 실행 가능한 솔루션은 원본 라이브러리에 포함시킬 헤더에 코드를 작성하는 것입니다. –

답변

1
  1. 정적 인 기능을 만듭니다.
  2. 이러한 함수에 대한 포인터가있는 struct을 작성하십시오. 확장 프로그램에서 사용할 수있는 별도의 #include 파일로 신고하세요. 전 세계는 사용할 수 없습니다.
  3. 내선 번호에서 struct을 사용하십시오. 이 같은

뭔가 :

// in the private header 
typedef struct 
{ 
    void (*p_myfunc1)(int); 
    int (*p_myfunc2)(void); 
} privateAPI_t; 
extern privateAPI_t privateAPI; 

// in the library 
static void myfunc1(int); 
static int myfunc2(void); 

privateAPI_t privateAPI = { myfunc1, myfunc2 }; 

// in the extension 
#include <privateAPI.h> 
... 
privateAPI.p_myfunc1(privateAPI.p_myfunc2()); 
+0

그다지 짧지는 않습니다! –

+0

모두 컴파일은 정상이지만 함수에 대한 널 포인터를 얻습니다. 'privateAPI_t privateAPI = {myfunc1, myfunc2};는 SO 라이브러리에 있고,이 라이브러리를 사용하는 app에는 privateAPI.p_myfunc1 (privateAPI.p_myfunc2());가있다. 어떤 아이디어를해야합니까? –

+0

나는 무엇이 잘못된 것인지 잘 모르겠다. 그러나 나는 명시적인 동적 init을 수행함으로써 그것을 고쳤다. 즉, 외부 변수를 사용하는 대신 런타임에 라이브러리에서 init 함수를 사용합니다. 중요한 것은 그것이 작동하고 있다는 것입니다. 감사합니다. –

관련 문제