2014-12-09 3 views
2

C99에서 함수 포인터의 구조가 NULL인지 아닌지 확인하는 방법이 있습니까? 내가 현재 가지고있는함수 포인터의 구조가 C99에서 NULL인지 확인하십시오.

은 다음과 유사합니다

typedef struct { 
    void* (*foo)(int a); 
    int (*bar)(int a, int b); 
} funcs; 

void *funcs_dll; 

funcs_dll = dlopen("my_funcs_dll.so", RTLD_GLOBAL); 
if (funcs_dll == NULL) { 
    THROW_ERROR; 
} 

funs.foo = dlsym(funcs_dll, "foo"); 
funcs.bar = dlsym(funcs_dll, "bar"); 

if (!funcs.foo || !funcs.bar) { 
    THROW_ERROR; 
} 

내가 무엇을 찾고 있어요 것은 내가 각각의 기능을 점검 할 필요가 없습니다 있도록 선택하면 두 번째를 줄일 수있다. 어떤 제안이라도 도움이 될 것입니다.

+0

[이 대답] (http://stackoverflow.com/a/2589876/2703418)을보십시오. – bzeaman

+0

코드가 공식적으로 잘 정의 된 동작은 아니지만 [이 예제는 질문에 100 % 응답합니다] (http://stackoverflow.com/questions/8696653/dynamically-load-a-function-from-a-dll/23763255) # 23763255). – Lundin

답변

0

직접, 아니요.

"임의의"값을 갖는 구조 안에 패딩이있을 수 있으므로 memcmp()을 일부 상수 버퍼와 비교하는 데 사용할 수 없습니다. 구조체의 크기가 정확히 인 함수 포인터 필드의 합계인지 확인할 수 있다면 아마도 그렇게 할 수 있습니다.

프록시를 사용할 수도 있습니다. 즉, 어떤 기능 포인터가 유효한지 나타내는 비트 세트 인 초기 uint32_t 멤버를 선언합니다. 그런 다음 병렬로 최대 32 (또는 uint64_t을 포함한 64) 개의 프록시 비트를 확인할 수 있습니다.

한 번만을 제안하려는 경우 제 제안은 데이터 중심 접근 방식입니다. 찾고자하는 함수 이름의 테이블을 정의하고 루프에서 처리하여 dlsym() 호출이 실패하자마자 종료합니다. 이 같은

const struct { 
    const char *name; 
    size_t  offset; 
} functions[] = { 
{ "foo", offsetof(funcs, foo) }, 
{ "bar", offsetof(funcs, bar) }, 
}; 

데이터 기반 코드는 매우 강력하고, 종종 매우 빠른 :처럼

뭔가.

0

반환 값이 NULL이면 오류 플래그를 설정할 dlsym에 대한 래퍼 기능을 만듭니다.