2013-05-15 1 views
9

나는 맥 OS X에 MIN의 정의를 보았다이 발견범위를 괄호로 묶고 C로 값을 반환 할 수 있습니까?

#define MIN(A,B) ({ __typeof__(A) __a = (A); __typeof__(B) __b = (B); __a < __b ? __a : __b; }) 

그것은 처음에는 너무 분명 아니지만,이 확장 할 때, 그것은 나에게 매우 이상하게 보이는 무언가로 전환 :

int a = 1, b = 2; 
// int min = MIN(a, b); 
int min = ({ 
    int __a = (a); 
    int __b = (b); 
    __a < __b ? __a : __b; 
}); 

실제로 이것은 마지막 표현식의 값을 "반환하는"표현식에 래핑 된 범위입니다. 이 범위 내에서 거의 임의의 코드로, 적어도 그 소리와 함께 작동하는 것 같다 :

int a = ({ 
    time_t x = time(NULL); 
    if (x % 3 == 1) 
     x++; 

    x % 10; 
}); 

내가 전에 본 적이없는, 그리고 표준인지 궁금했다. 나는 Visual Studio가 그것을 받아들이지 않을 것이라는 사실을 알고 있지만, Visual Studio는 C89에 붙어 있기 때문에 그렇게 말하지는 않습니다.

+0

질문에 대한 답변이 http://ko.wikipedia.org/wiki/Blocks_(C_language_extension) – SomeWittyUsername

+7

@icepack, 블록이 아닙니다. 블록은 괄호 연산자로 호출해야하며'^'문자로 시작해야합니다. – zneak

+1

FWIW, [ISO 9899 : 1999] (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf)에서 찾을 수없는 항목이 있습니다. (이것이 그곳에 있지 않다는 의미는 아니지만 분명히 내가 생각하는 곳에서는 분명하지 않습니다.) – millimoose

답변

9

이것은 표준 C의 GCC 확장자이며 Statement Expressions입니다. 네, GNU 컴파일러 만 지원하면됩니다 (크로스 플랫폼이기도합니다). 표준 C를 고수해야하는 경우 표기법을 사용하지 않습니다.

+0

발견 : http://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html 감사합니다. – zneak

관련 문제