2010-01-16 5 views
8

가끔, C 매크로는 다음과 같이 무언가로 작성된 것으로 나타났습니다 :C에서`({});`에 대한 추가 정보?

  1. ({}); 컴파일하지만, 아무것도하지 않고 :
    #define foo(bar) ({ ++bar; }) 
    

    몇 가지 실험 후, 나는 것으로 나타났습니다. (예상대로)
  2. ;을 끄면 구문 오류가 발생합니다. 이것의 부작용은 foo()가 코드에서 함수처럼 보이는지 확인하는 것입니다. (세미콜론을 끈 채로두면 오류는 문제를 진단하는 데별로 유용하지 않습니다.)
  3. return ({});은 void 함수를 사용하려고 할 때와 마찬가지로 무시되지 않는 void 값에 대해 불평합니다.

개발자가 매크로에 세미콜론을 추가하는 것입니까, 아니면 다른 용도입니까? 나는 Google을 사용해 봤지만 구두점으로는 비참하게 실패합니다. 이 이름이 있나요?

답변

8

이것은 statement expressions이라는 GNU 확장 프로그램입니다.

표준 C에서 매크로를 선언 할 때 비슷한 목적 (예 : 블록 범위 만들기)에 do...while(0) 루프가 사용되는 경우가 종종 있습니다. 명령문 표현식은 값을 반환 할 수 있기 때문에 루프 해킹보다 우수합니다. 표준 C에서 비슷한 것을하고 싶다면 추가 함수를 정의하고 렉시 컬 범위 지정의 편의를 잃어 야합니다.

2

()은 표현식입니다. ({code; code;})는 표현식 안에 복합 문입니다. 이것은 GNU C 확장입니다.

http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_4.html

편집 : 와우, 내가 구글에서 해당 링크를 얻고 처음에 gcc가 2.95이었다 통지를하지 않았다. 고대!

+0

고대 - 그러나 구문은 4.4.2에서 여전히 지원됩니다. –

3

멋진 표현이 있으면 명령문 표현에 대한 멋진 점은 마지막 문장이 표현식의 결과라는 것입니다.

#define foo(bar) ({ ++bar; 3.1415927; }) 

int i = 0; 
float pi = foo(i);