C에서 함수를 매개변수로 어떻게 전달합니까?
-
08-06-2019 - |
문제
데이터 세트에 대해 매개변수로 전달된 함수를 수행하는 함수를 만들고 싶습니다.C에서 함수를 매개변수로 어떻게 전달합니까?
해결책
선언
함수 매개변수를 취하는 함수의 프로토타입은 다음과 같습니다:
void func ( void (*f)(int) );
이는 매개변수가 f
다음을 갖는 함수에 대한 포인터가 될 것입니다. void
반환 유형이며 단일을 사용합니다. int
매개변수.다음 함수(print
)는 다음으로 전달될 수 있는 함수의 예입니다. func
적절한 유형이므로 매개변수로 사용합니다.
void print ( int x ) {
printf("%d\n", x);
}
함수 호출
함수 매개변수를 사용하여 함수를 호출할 때 전달되는 값은 함수에 대한 포인터여야 합니다.이를 위해 함수 이름(괄호 없이)을 사용하십시오.
func(print);
전화할 것이다 func
, 인쇄 기능을 전달합니다.
기능 본체
다른 매개변수와 마찬가지로 func는 이제 함수 본문에서 매개변수 이름을 사용하여 매개변수 값에 액세스할 수 있습니다.func가 숫자 0-4에 전달된 함수를 적용한다고 가정해 보겠습니다.먼저 루프가 print를 직접 호출하는 모습을 고려하세요.
for ( int ctr = 0 ; ctr < 5 ; ctr++ ) {
print(ctr);
}
부터 func
의 매개변수 선언에 따르면 f
는 원하는 함수에 대한 포인터의 이름입니다. 먼저 다음을 기억합니다. f
그렇다면 포인터입니다 *f
그 일이야 f
(즉,함수 print
이 경우).결과적으로 위 루프의 모든 인쇄 항목을 다음으로 바꾸십시오. *f
:
void func ( void (*f)(int) ) {
for ( int ctr = 0 ; ctr < 5 ; ctr++ ) {
(*f)(ctr);
}
}
에서 http://math.hws.edu/bridgeman/courses/331/f05/handouts/c-c++-notes.html
다른 팁
이 질문에는 함수 포인터 정의에 대한 답이 이미 나와 있습니다. 그러나 함수 포인터를 매우 지저분하게 만들 수 있습니다. 특히 응용 프로그램 주위로 함수 포인터를 전달하려는 경우에는 더욱 그렇습니다.이러한 불편함을 피하기 위해 함수 포인터를 더 읽기 쉬운 형식으로 정의하는 것이 좋습니다.예를 들어.
typedef void (*functiontype)();
void를 반환하고 인수를 사용하지 않는 함수를 선언합니다.이 유형에 대한 함수 포인터를 만들려면 이제 다음을 수행할 수 있습니다.
void dosomething() { }
functiontype func = &dosomething;
func();
int를 반환하고 char을 취하는 함수의 경우
typedef int (*functiontype2)(char);
그리고 그것을 사용하려면
int dosomethingwithchar(char a) { return 1; }
functiontype2 func2 = &dosomethingwithchar
int result = func2('a');
함수 포인터를 읽기 쉬운 유형으로 바꾸는 데 도움이 되는 라이브러리가 있습니다.그만큼 부스트 기능 도서관은 훌륭하고 노력할만한 가치가 있습니다!
boost::function<int (char a)> functiontype2;
위의 것보다 훨씬 멋지네요.
C++11부터 다음을 사용할 수 있습니다. 기능적 라이브러리 간결하고 일반적인 방식으로 이를 수행합니다.구문은 예를 들어 다음과 같습니다.
std::function<bool (int)>
어디 bool
여기서 첫 번째 인수가 유형인 단일 인수 함수의 반환 유형입니다. int
.
아래에 예제 프로그램을 포함시켰습니다.
// g++ test.cpp --std=c++11
#include <functional>
double Combiner(double a, double b, std::function<double (double,double)> func){
return func(a,b);
}
double Add(double a, double b){
return a+b;
}
double Mult(double a, double b){
return a*b;
}
int main(){
Combiner(12,13,Add);
Combiner(12,13,Mult);
}
하지만 때로는 템플릿 함수를 사용하는 것이 더 편리할 때도 있습니다.
// g++ test.cpp --std=c++11
template<class T>
double Combiner(double a, double b, T func){
return func(a,b);
}
double Add(double a, double b){
return a+b;
}
double Mult(double a, double b){
return a*b;
}
int main(){
Combiner(12,13,Add);
Combiner(12,13,Mult);
}
통과하다 다른 함수에 대한 매개변수인 함수의 주소 아래 그림과 같이
#include <stdio.h>
void print();
void execute(void());
int main()
{
execute(print); // sends address of print
return 0;
}
void print()
{
printf("Hello!");
}
void execute(void f()) // receive address of print
{
f();
}
또한 다음을 사용하여 함수를 매개변수로 전달할 수 있습니다. 함수 포인터
#include <stdio.h>
void print();
void execute(void (*f)());
int main()
{
execute(&print); // sends address of print
return 0;
}
void print()
{
printf("Hello!");
}
void execute(void (*f)()) // receive address of print
{
f();
}
당신은 함수 포인터.구문은 약간 번거롭지만 일단 익숙해지면 정말 강력합니다.
6.7.6.3p8에 따라 함수는 함수 포인터로 "전달"될 수 있습니다."``함수 반환 유형''으로 매개변수를 선언하는 것은 6.3.2.1에서와 같이 ``함수 반환 유형에 대한 포인터''로 조정되어야 합니다. ".예를 들면 다음과 같습니다.
void foo(int bar(int, int));
이는 다음과 같습니다:
void foo(int (*bar)(int, int));
실제로는 함수는 아니지만 지역화된 코드 조각입니다.물론 결과만 코드에 전달되지는 않습니다.나중에 실행되도록 이벤트 디스패처에 전달하면 작동하지 않습니다(결과는 이벤트가 발생할 때가 아니라 지금 계산되기 때문입니다).하지만 그것이 당신이 하려는 전부라면 코드를 한 곳으로 지역화할 수 있습니다.
#include <stdio.h>
int IncMultInt(int a, int b)
{
a++;
return a * b;
}
int main(int argc, char *argv[])
{
int a = 5;
int b = 7;
printf("%d * %d = %d\n", a, b, IncMultInt(a, b));
b = 9;
// Create some local code with it's own local variable
printf("%d * %d = %d\n", a, b, ( { int _a = a+1; _a * b; } ) );
return 0;
}