C의 콜백 함수
콜백 함수 사용 시기 및 방법:
콜백 함수 다른 함수에 인수로 전달되는 함수 포인터 또는 객체입니다. 그런 다음 이러한 콜백 함수는 호출된 함수 내에서 호출되어 제공된 콜백 논리에 따라 동작을 사용자 정의합니다.
콜백 함수가 사용되는 일반적인 시나리오:
C의 호출 가능 유형(11):
콜백 기능은 여러 유형의 콜러블을 사용하여 구현할 수 있습니다. 포함:
콜백 작성:
콜백 유형을 작성하는 구문은 사용되는 콜백 유형에 따라 다릅니다. 개요는 다음과 같습니다.
1. 함수 포인터:
typedef int (*f_int_t)(int); int (* foo_p)(int);
2. 멤버 함수에 대한 포인터:
typedef int (C::* f_C_int_t)(int); int (C::* C_foo_p)(int);
3. 표준::함수:
std::function<int(int)> stdf_foo = &foo; std::function<int(const C&, int)> stdf_C_foo = &C::foo;
4. 템플릿 기반 콜백 유형:
template<class R, class T> void stdf_transform_every_int_templ(int * v, unsigned const n, std::function<R(T)> fp)
콜백 호출:
콜백 호출 구문은 콜백 유형에 따라 다릅니다. 개요는 다음과 같습니다.
1. 함수 포인터:
int b = foobar(a, foo);
2. 멤버 함수에 대한 포인터:
int b = C_foobar(a, my_c, &C::foo);
3. 표준::함수:
int b = stdf_foobar(a, stdf_foo);
4. 템플릿 기반 콜백 유형:
stdf_transform_every_int_templ(&a[0], 5, &foo);
예:
콜백을 사용하여 배열의 모든 정수를 변환하는 함수의 다음 예를 고려하세요.
void tranform_every_int(int * v, unsigned n, int (*fp)(int)) { for (unsigned i = 0; i < n; ++i) { v[i] = fp(v[i]); } }
이 함수는 다양한 콜백 함수와 함께 사용하여 다양한 목적을 달성할 수 있습니다. 동작:
// Using a function pointer int double_int(int x) { return 2*x; } int a[5] = {1, 2, 3, 4, 5}; tranform_every_int(&a[0], 5, double_int); // Transform the array using the double_int callback // Using lambda expression tranform_every_int(&a[0], 5, [](int x) -> int { return x/2; }); // Transform the array using an anonymous function that divides each element by 2 // Using std::bind int nine_x_and_y (int x, int y) { return 9*x + y; } std::placeholders::_1; tranform_every_int(&a[0], 5, std::bind(nine_x_and_y, _1, 4)); // Transform the array using std::bind with nine_x_and_y
결론적으로 콜백 함수는 함수 동작을 사용자 정의하고 C에서 동적 런타임 동작을 활성화하기 위한 강력하고 유연한 메커니즘을 제공합니다. 다양한 호출 가능 항목을 사용하여 구현할 수 있으며 그에 따라 구문도 달라집니다.
위 내용은 C에서 콜백 함수를 언제 어떻게 사용해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!