2011-03-23 5 views
4

종종 매크로에서 사람들은 세미콜론을 삼키기 위해 do { ... } while(0)을 사용하는 경우가 있습니다. 나는 단지 그들이 대신 ({ ... })를 사용하는 예를 건너 왔어요,뿐만 아니라 세미콜론을 삼키는 것,하지만 당신은뿐만 아니라 값을 반환 할 수 있도록 보인다세미콜론을 삼키기 위해 ({...}) 매크로를 사용하십시오.

#define NEW_MACRO() ({ int x = 1; int y = 2; x+y; }) 

if(1) 
    val = NEW_MACRO(); 
else 
    printf("this never prints");` 

발은 내가 할 수있는 3 인 나올 것 그것에 관한 문서를 찾지 못해서 조금주의를 기울였습니다. 이 방법으로 어려움이 있습니까?

+0

GNU 확장 프로그램입니다. –

+0

내가 기억하는 한, 표준이 아닙니다 (gcc 호환 가능). – cobbal

+1

이 코드는 C가 아니며 "GNU C"입니다. –

답변

8

이 일부 컴파일러 확장을 할 수 있습니다 표준 C.

에 유효하지 않습니다 (예를 들어, GCC의 statement expressions) 이런 종류의 물건을 할 수 있습니다.

+1

이 특별한 표기법 인'({...}) '이 발명되었습니다 필자가 아는 한 GCC (적어도 널리 사용되는 GCC 2.7.2.3까지 거슬러 올라간다)이며 Linux 용 인텔 독점 컴파일러와 같은 GCC의 확장과 호환되기를 원하는 컴파일러에 의해서만 선택되었습니다. – zwol

+1

+1 코드를 모호하게하는 트위스트 방식이기 때문에 디버깅을 더 어렵게 만듭니다. – slezica

0

do { ... } while(0)은 "세미콜론을 삼키지 않는"것이 아닙니다. C 표현식을 C 문으로 변환하기위한 것입니다.

+2

아니요, C 블록을 C 문으로 변환하기위한 것입니다. 즉, if 함수를 포함 할 때 단일 "함수 호출"처럼 동작합니다 '/'else'와'do' /'while' 문을 사용합니다. –

+0

@R 사용자가 어떤 용도로 사용해도 * 사용할 수 있습니다. 세미콜론을 삼키기 위해 * 사용하는 것도 보았습니다. 또한 세미콜론을 사용하면 설명하는 효과도 있습니다. –

1

올리 (Oli)가 올바르게 말한 것처럼 gcc가 발명했습니다. 목표는 매크로 요소를 한 번만 평가하고 그 계산 된 값을 나중에 이름을 사용하여 사용할 수있게하는 것입니다 (종종 typeof 확장이 있음).

많은 경우 이러한 기능은 inline 기능을 사용하여 완전히 피할 수 있습니다. 이것들은 또한 유형에보다 엄격한 이점을 가지고 있습니다.

함수에 전달한 임시 변수를 필요로하는 다른 경우에는 C99에도이 함수에 사용할 수있는 복합 리터럴이 있습니다.

+0

+1 "(dis)"및 추악한 임시 변수 대신 복합 리터럴을 사용합니다. –

관련 문제