이 매크로를 사용하면
int (*max)(int, int) = lambda(int,
(int x, int y) {
return x > y ? x : y;
});
로 확장 :
int (*max)(int, int) = ({
int _ (int x, int y) { return x > y ? x : y; }
_;
});
중괄호에서는 GCC의 중첩 함수 를 사용하여 원하는 작업을 수행하는 함수를 만듭니다. 내부 범위 내에서 이름은 _
입니다.
그런 다음 interjay가 언급 한대로 GCC의 명령문 표현식 이 사용됩니다. 효과적으로 함수 _
가 포인터에 할당됩니다 max
.
이러한 매크로를 사용하지 않으면 다르게 작성하여 다음과 같이 사용할 수 있습니다.
int val1 = 4;
int val2 = -30;
int perform_operation(int (*op)(int, int)) {
int new_val = op(val1, val2);
val1 = val2;
val2 = new_val;
return new_val;
}
int enclosing_function (void) {
// Create max "lambda"
int (*max)(int, int);
{
// Curly braces limit the scope of _
int _ (int x, int y) { return x > y ? x : y; }
max = _;
}
return perform_operation(max);
}
이 코드 예제 에서는 세 가지 방법을 비교할 수 있습니다 .
gcc -E
을 확인하려고하십니까 (예 :)?