2012-01-19 3 views
8

부스트 (Bind & 함수) 이외의 다른 방법은 어떻게 C++에서 함수를 동적으로 호출 할 수 있습니까?동적으로 함수를 C++로 호출하는 방법

PHP는 있습니다

$obj = new MyObject(); 
$function = 'doSomething'; 
$obj->$function(); 

오브젝티브 C는 있습니다

MyObject *obj = [[MyObject alloc] init]; 
SEL function = NSSelectorFromString(@"doSomething"); 
[obj performSelector: function]; 
+0

http://stackoverflow.com/questions/11016078/is-it-possible :

void *handle = dlsym(0, RTLD_LOCAL | RTLD_LAZY); FunctionType *fptr = (FunctionType *)dlsym(handle, "hello"); fptr(); 

이 일 통근자 "C"의 무리입니다 후드 않는, 그래서 여기에 짧은 명단입니다 -c-function-dynamic-in-c-runtime-in-c – dtech

+0

관련 검색 키워드 : C++에서는 "가상 함수"와 "후기 바인딩 또는 동적 바인딩"을 찾습니다. C에서 "함수 포인터". – lepe

답변

2

당신이 동일한 유형의 아르에 관심이있는 사람들 기능, 당신은 문자열과 함수 포인터의지도를 만들 수 있다면.

+0

그러면 목록을 최신 상태로 유지해야합니다. 나는 더 많은 것을 자동적으로 찾고있다. – joels

+0

당신은 그것을 생성하기 위해 어떤 프로그램을 사용할 수 있습니다 (아마도 마지막에 sed 비트가있는 ctags 일 수도 있습니다). – stralep

+0

@joels - 코드를 생성하는 것은 쉽습니다. – dtech

2

간단한 대답은 할 수 없습니다. C++은 메서드를 이름으로 검색하지 않습니다.

+1

틀린, 당신은 DLL 함수를 이름으로 검색 할 수 있습니다. – dtech

+2

@ddriver DLL은 C++의 일부가 아니며 DLL 함수는 C++ 메서드가 아닙니다. – Roddy

+0

@Roddy - C++을 DLL로 컴파일하고 이름 조회를 통해 함수에 대한 포인터를 얻을 수 있습니다. Windows에서 DLL을, 그래서 리눅스에서, 뭐든, 당신은 이름으로 동적 라이브러리에서 함수를 검색 할 수 있습니다. 그것은 사실입니다. – dtech

8

당신은 (__dllexport로 표시하여 예) 필요한 기능을 내보내고 자신의 주소를 얻기 위해 GetProcAddress를하거나 dlsym을 (플랫폼에 따라)를 사용할 수 있습니다 :

 

HANDLE handle = GetCurrentProcess(); 
FunctionType *fptr = (FunctionType *)GetProcAddress(handle, "doSomething"); 
fptr(); 
 

이 모든

 

void *handle = dlsym(0, RTLD_LOCAL | RTLD_LAZY); 
FunctionType *fptr = (FunctionType *)dlsym(handle, "doSomething"); 
fptr(); 
 
은 플랫폼 별이다 하지만 이것을하기위한 C++에는 표준 방법이 없습니다.

+3

불만을 표시 할 수 없습니다. 좋은 대답입니다.그러나 C 함수에 대한 동적 호출에는 매우 유용하며 다형성 C++ 메소드 호출에서는 작동하지 않을 것이라고 지적 할 것입니다. –

+0

@GrahamPerks : 음, 맹 글링, 오브젝트 포인터 조정 등등과 같은 것들을 사용하면 더 많은 플랫폼에만 적용될 수 있습니다.하지만 완전히 불가능하지는 않습니다. 하지만, 나는 프로덕션 환경에서 그런 일을 결코하지 않을 것이라고 생각합니다. –

+1

선언 중에 extern "C"로 참조 할 함수를 표시하여 컴파일 중 이름이 잘리지 않도록 할 수도 있습니다. extern "C"무효 hello() { std :: cout << "Hello \ n"; } 이렇게하면 이름으로 함수를 호출 할 수 있습니다. void * handle = dlsym (0, RTLD_LOCAL | RTLD_LAZY); FunctionType * fptr = (FunctionType *) dlsym (handle, "hello"); fptr(); 다음은 외부 "C"가 처리하는 내용입니다. http://stackoverflow.com/questions/1041866/in-c-source-what-is-the-effect-of-extern-c – deadbabykitten

2

내가 올바르게 질문을 이해한다면 C++에서 함수 포인터 (또는 멤버에 대한 포인터)를 사용할 수 있습니다. 어떤 함수 호출 (동적 함수의 원형이 필요할 수도 있음)을 동적으로 결정하고 동적으로 호출 할 수 있습니다. 질문에 콘스탄틴 Oznobihin의 대답에 확장이 링크

https://isocpp.org/wiki/faq/pointers-to-members

2

를 참조하십시오, 당신은 컴파일하는 동안 이름을 엉망으로에서 컴파일러를 방지하기 위해 당신이 선언에서 통근 "C"로 참조하는 C++ 기능을 표시 할 수 있습니다.

extern "C" void hello() { 
    std::cout << "Hello\n"; 
} 

이렇게하면 처음에 지정한 이름으로 개체/기능을 호출 할 수 있습니다. 이 경우 '안녕하세요'입니다. In C++ source, what is the effect of extern "C"?

+0

이것을 @KonstantinOznobihin의 답변에 추가하십시오. 어쨌든, 좋은 팁 주셔서 감사합니다. – Jet

관련 문제