2016-09-30 2 views
0

하나의 매크로에 여러 문장을 쓰는 것이 올바른 방법입니까?하나의 매크로에 여러 개의 문장이 있음

#define AB() do { printf("hi"); } while(0) 
+1

매크로는 텍스트 대체 용입니다. 나는 그 질문이 의미가 있다고 생각하지 않는다. 매크로는 구문 단위가 아니기 때문에 일반적으로 * in * 매크로를 사용하지 않습니다. –

+0

이제는 매크로를 사용하는 방법에 따라 달라집니다. –

+0

해당 매크로는 함수 호출, 즉 AB();로 쓸 수 있다는 이점이 있습니다. –

답변

0

예. 올바른 방법입니다.

이상적으로 당신은 매크로 하지 화합물 문하는 하나의 문으로 확장하고자합니다. 네가 그것을 만족시킨다.

이 매크로는 if, else 블록에서 안전하게 사용할 수 있습니다.

1

예.

올바른 방법은 대부분 함수와 유사한 매크로가없는 경우가 대부분입니다.

계십니까-동안 (0) 트릭은

if(x) 
    AB(); 
else 

로, 실수 중괄호 스타일 코드베이스 만 관련이 있습니다 할 일-동안 (0)에 의해 발생하는 컴파일러 오류를 방지 할 트릭 빗나간 세미콜론, else 다음 문장이있는 경우. 매크로가 중괄호 만 사용했다면 if(){}; else이 발생합니다. 이는 구문 오류입니다.

위의 중괄호 스타일은 역사상 가장 비싼 소프트웨어 버그 중 하나 인 Apple "goto-fail"버그를 유발했습니다. 그래서 그것을 사용하지 않는 아주 건전한 이유가 있습니다. 모든 문 다음에 항상 {}을 사용하면 do-while (0) 트릭도 관련성이 없어집니다.

관련 문제