2009-07-15 5 views
0

매크로 초보자를 도우십시오 ... 매크로에서 생성 된 코드가 (디버깅을 위해) 실행될 때마다 로그 할 수 있도록 이미지를로드하고 여러 줄로 나누는 간단한 매크로를 만들었습니다. 그것은 다음과 같습니다매크로에서 주석 처리 된 라인

#define LOAD_PNG(L_I_IMAGE_NAME) ({ \ 
PngImageClass* __tmp; \ 
printf("Loading png: %s", L_I_IMAGE_NAME);\ 
__tmp = [image loading code here];\ 
__tmp; \ 
}) 

내 계획이 쉽게 로그 행을 주석 할 수 있었다 (수동)이 필요하지만, 사전 프로세서는 정상적인 방법 중 하나를 용납하지 않을 때. 어떻게해야합니까?!

편집 : 나는 한 줄 주석 만 시도 할만큼 게으르다는 이유로 완전히 "정상적인 방식으로 작동하지 않는다"는 말은 완전히 잘못되었습니다. 또한 여러 응답자의 조언을 듣고이를 기능으로 전환 할 것입니다. 아니, 거기에 매크로를 사용하는 데는 이유가 없다.

+4

함수 대신 매크로를 사용하는 이유가 있습니까? 이것은 매크로가 좋은 아이디어 인 것처럼 보이지 않습니다. – Eric

답변

10

당신은 이런 식으로 작업을 수행 할 수 있습니다

#define LOAD_PNG(L_I_IMAGE_NAME) ({ \ 
PngImageClass* __tmp; \ 
/*printf("Loading png: %s", L_I_IMAGE_NAME);*/\ 
__tmp = [image loading code here];\ 
__tmp; \ 
}) 

단일 라인은 특별히 끝에 백 슬래시 (\)를 제공하여 선을 계속하는 컴파일러를 요구하고 있기 때문에 작동하지 않습니다 단순히 // 코멘트 모든 라인.

+0

주석은 줄 백 슬래시의 끝 전에 중지되어야합니다. 그렇지 않으면 선들이 서로 연결되지 않으며 매크로 정의에 모두 포함되지는 않습니다. (즉, 세 번째 줄은 "\ */\"대신 "*/\"로 끝나야합니다.) –

+0

맞습니다. 지적 해 주셔서 고마워요. – Aamir

2

매크로가 모두 한 줄이므로 (줄 연속을 통해) '#if 0'또는 '//'- 스타일 주석을 사용할 수 없습니다./**/잘 작동합니다.

게시 한 스 니펫에서 이것은 어쨌든 매크로가 아닌 것처럼 보입니다. 매크로는 어떤 식 으로든 텍스트 대체를 이용하는 경우에만 사용해야합니다 (예 : 변수와 ​​변수 이름 모두 필요).

1

왜 매크로 문 주위에 괄호가 있습니까? 프리 프로세서 문제가 생기면 컴파일되지 않으며 확실히 필요하지 않습니다. 은/.../스타일의 주석에 추가

+0

컴파일하지만, 왜 내가 사용했는지 기억이 안납니다. 하나의 매크로를 복사했거나 혼동 된 테스트 세션의 결과입니다. 기억이 안나. 나는 괄호를 제거 할 것이다 :) – Felixyz

+0

그것은 이상하다. 난 당신과 같은 괄호로 일부 코드를 컴파일 해봤는데 컴파일되지 않았다. 참고로 cygwin에서 gcc 3.4.4와 함께 사용했습니다. – Key

0

, 당신은이 작업을 수행 할 수 있습니다

if (0) printf(...); 

더 좋은 방법이되지 않는 한,하지만 매크로를 사용하는 대신 함수로 돌려하지 않는 것입니다 매크로를 사용하는 데는 정말로 중요한 이유가 있습니다 (그러나 아무 것도주지 않았습니다).

+0

이것은 결코 최적화되지 않을 것입니다, 그렇죠? – Felixyz

+0

전적으로 컴파일러에 따라 다릅니다. 나는 명백한 컴파일러가 그것을 명백하게하기를 기대한다. 왜냐하면 이것은 명백한 사례이기 때문이다. –

+0

실제로, 우분투의 gcc는 -O 옵션을 사용하지 않아도이를 최적화하는 것으로 보입니다. –

관련 문제