2009-09-03 2 views
3
다음과 같이 코드가 삽입되어야하는 매크로를 만들고 싶습니다. 코드에 FOOBAR을 넣습니다. 확실하지는 않지만 컴파일 타임에 컴파일러는 위의 예와 같이 실제 코드로 바꿉니다. 어쩌면 내가 사용할 수있는 매크로와 다른 뭔가가 있을까요?

답변

8

\를 사용하여 매크로에 포함 할 각 줄 바꿈을 이스케이프 처리합니다.

그러나주의해서 사용하지 않으면 이러한 매크로를 사용하면 구조를 숨길 수 있습니다. 예를 들면 다음과 같습니다.

if (bar) 
    FOOBAR(); 
else 
    do_something_else(); 

짐작할 부분이 무엇인지 짐작하십시오. 아마도 당신이 생각하는 것이 아닙니다. 다음은 컴파일러가 보는 것입니다 (들여 쓰기가 조정 됨) :

if (bar) 
    if (foo) 
     { 
      [Bar fooBar]; 
     } 
; 
    else 
     do_something_else(); 

이 세미콜론은 별도의 빈 문장입니다. 각 if에는 단 하나의 명령문 만 사용됩니다. 첫 번째 if의 문장은 두 번째 if이고 두 번째 if의 문장은 복합 문장 ({…})이므로 세미콜론을 제외하고 할당량을 모두 충족 시켰습니다.

따라서 세미콜론은 무조건 if에 바인딩되지 않습니다. 무조건 서술문에 else을 적용하려고하면 구문 오류가 발생합니다.

수정은, 그것이 추한 같은 do…while 성명에서 FOOBAR의 내용을 래핑하는 것입니다 :

#define FOOBAR()  \ 
    do {    \ 
     if (foo)   \ 
      [Bar fooBar]; \ 
    } while(0) /*semicolon omitted*/ 

을 우리가 매크로 정의에 세미콜론을 생략하기 때문에, do…while 때문에, 종결되지 않은 문장이다 매크로 사용법 밖의 세미콜론이 그것에 바인드됩니다. 그리고 우리의 확장 된 코드는 다음과 같습니다 : 당신이 의도 한대로

//First, the unexpanded code again 
if (bar) 
    FOOBAR(); 
else 
    do_something_else(); 

//Expanded 
if (bar) 
    do 
     { 
      if (foo) 
       [Bar fooBar]; 
     } 
    while(0); 
else 
    do_something_else(); 

else 지금, if (bar)에 결합한다.

5

매크로를 여러 행에 정의하려면 마지막 행을 제외한 각 행의 끝에 \를 추가하십시오. 불행히도 실제로 사용하면 매크로가 단일 행으로 확장됩니다.

+0

나는 objective-c 매크로가 평범한 C 매크로와 똑같은 것으로 여기에서 큰 가정을하고있다. –

+1

예, C 전 처리기 언어는 Objective-C에서 변경되지 않았습니다. –

관련 문제