다중 라인 전 처리기 매크로


81

다중 라인 전 처리기 매크로를 만드는 방법은 무엇입니까? 한 줄을 만드는 방법을 알고 있습니다.

#define sqr(X) (X*X)

하지만 다음과 같은 것이 필요합니다.

#define someMacro(X)
    class X : public otherClass
    {
         int foo;
         void doFoo();
    };

이 작업을 수행하려면 어떻게해야합니까?

이것은 예시 일 뿐이며 실제 매크로는 매우 길 수 있습니다.


SO를 검색하면 쉽게 답을 얻을 수 있습니다. 예 : stackoverflow.com/questions/4007865/…
Forever Learner

다른 방법은 현재 위치 : parashift.com/c++-faq/macros-with-multi-stmts.html
Ayrat

답변:


123

당신은 사용할 \줄 연속 이스케이프 문자로.

#define swap(a, b) {               \
                       (a) ^= (b); \
                       (b) ^= (a); \
                       (a) ^= (b); \
                   }

편집 : @abelenky가 주석에서 지적했듯이 \문자 는 줄의 마지막 문자 여야합니다 . 그렇지 않은 경우 (나중에 공백 일지라도) 그 뒤의 각 줄에 혼란스러운 오류 메시지가 표시됩니다.


44
주의 사항 : \가 줄 의 마지막 문자 인지 확인하십시오 . C에서 공백은 일반적으로 중요하지 않지만이 경우 줄 끝의 보이지 않는 공백이 당신을 죽일 수 있습니다.
abelenky

2
결과 텍스트가 한 줄에 있다는 것을 추가해야합니다. C는 토큰 사이의 모든 공백을 동일하게 처리하기 때문에 일반적으로 중요하지 않지만 여전히 그렇습니다.
피터 - 분석 재개 모니카

내가 제안하고 싶은 또 다른 일은 ` after all useful lines of the macro, and add a comment afterward saying something like // 매크로 . It's sometimes easier to ensure that all lines of a macro end with ` 뒤에 필요한 빈 줄 을 배치하는 것 입니다.
supercat 2015-08-15

나는 당신이 변수를 교환하기 위해 비트 xor를 사용할 수 있다는 것을 몰랐지만 나는 당신이 그것을 가지고 있었으면 좋겠다!
cmarangu

18

\각 줄 끝에 백 슬래시 ( )를 추가하여 매크로를 여러 줄로 확장 할 수 있습니다 .

#define F(x) (x)   \
              *    \
             (x)

18

참고 Kerrek SB와 coaddict 등은 허용 대답에 지적되어 있어야하는 지적 항상 당신의 인수 주변의 장소 중괄호. sqr 예제는 CompSci 코스에서 가르치는 간단한 예제입니다.

문제는 다음과 같습니다. "sqr (1 + 5)"라고 말하면 어떻게됩니까? 당신은 "1 + 5 * 1 + 5"또는 11 을 얻
습니다 그 주위에 중괄호를 올바르게 배치 #define sqr(x) ((x)*(x))
하면 ((1 + 5) * (1 + 5)) 또는 우리가 원하는 36 ... 아름다움을 얻을 수 있습니다.

Ed S.는 'swap'과 같은 문제를 겪을 것입니다.


방법은 sqr(++i)? (우리는이 가정 int i:))
게자 토록

나는 그것을 연습 i으로했고 매크로로 대체됨에 따라 분명히 증가하고 (이 경우 두 번 대체 됨) 곱해집니다. 그래서sqr(++5) == ((7) * (7))
jiveturkey

2
GézaTörök @ 확대 sqr(++i)하려면 ((++i)*(++i))값 인해 정의되지 않은 동작을 호출하는 것 i보다 그 명령문 (동작 시퀀스 사이에 포인트) 내에 한 번 이상 변경된다.
moooeeeep 2015

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.