2008-09-15 6 views

답변

24

예 만 사람 VC++ 2005 구문 귀하의 예는 다음과 같습니다 :

#define DBGPRINT(fmt, ...) printf(fmt, __VA_ARGS__) 

전체 참조는 here입니다.

-2

거의. 그것은 그 생각보다 못 생겼어 (그리고 당신은 아마 매크로 자체가 뒤에 세미콜론을 원하지 않는 :

#define DBGPRINT(DBGPRINT_ARGS) printf DBGPRINT_ARGS // note: do not use '(' & ')' 

그것을 사용하려면 :

DBGPRINT(("%s\n", "Hello World")); 

는 (괄호 한 쌍의 누락되었다).

모든 악재는, 원래의 질문이 VC++의 버전을 명시하지 않았고, 가변 인자 매크로를 모든 컴파일러에서 지원하지 않는 이유는 확실하지.

+0

을 현저이의 더 잘못된 버전 위에있어 최대하지만 누락 된 괄호가 ...이 파손 된 것을 의미하기 때문에 Persumably downvotes이었다 5 upvotes. 여러분 모두 간단한 '#define DBGPRINT printf'를 놓쳤습니다. –

4

예, 당신은 비주얼 스튜디오 C에서이 작업을 수행 할 수 있습니다 ++ 2005 이상 버전 (VS 2003은 확실하지 않음). VA_ARGS을 살펴보십시오.

#define DBGPRINTF(fmt, ...) printf(fmt, __VA_ARGS__) 

을하고 매크로 변수의 인수는 그 다음 우리가 그들을 구문 분석 va_args 수 '...'인수로 제공되는 함수에 전달 얻을 것이다 : 당신은 기본적으로 같은 것을 할 수 있습니다.

VA_ARGS 및 매크로 사용과 관련된 이상한 동작이있을 수 있습니다. VA_ARGS이 가변적이기 때문에 0 인수가있을 수 있습니다. 그러면 의도하지 않은 후행 쉼표로 나갈 수 있습니다.

+0

VC++은 인수가 없으면 후행 쉼표를 사용합니다, 그렇지 않습니까? –

0

작업해야 다음 (Variadic macros에 링크를 참조하십시오.)는

(아래 예는 고정 및 가변 인자를 나타낸다.)

# define DBGPRINTF(fmt,...) \ 
    do { \ 
     printf(fmt, __VA_ARGS__); \ 
    } while(0) 
0

MSDN의 "VA_ARGS"및 va_list를 검색하십시오! 실제로 __FILE__, __LINE__, 토큰 매크로 기능 (어떤이 필요하지 않은 경우

#define DBGPRINT(args) printf(args); 
DBGPRINT(("%s\n", "Hello World")); 
4

, 당신은 별도의 브라켓을 제공했습니다 -pasting, etc.) stdargs.h을 사용하여 variadic 함수를 작성하는 것이 좋습니다. printf()을 호출하는 대신 variadic 함수는 가변 인수 목록을 전달하기 위해 vprintf()을 호출 할 수 있습니다.MSVC 7.1

+4

이것은 너무 잘못되었습니다,하지만 upvotes있어 ... 나는 정의의 끝에 혼자 세미콜론에 대한 사람을 해고 것입니다. 당신이 의도 한 것 :'#define DBGPRINT (args) printf args' ...하지만이 경우 단지'#define DBGPRINT printf'가 할 것입니다. –

+0

#define DBGPRINT printf는 실행 파일에서 모든 디버깅 출력 코드를 삭제하려는 경우 수행하지 않습니다. 모든 (...) 매개 변수 목록이 남아있을 것이고 적어도 경고를 유발하고 오류 및 예기치 않은 부작용을 유발할 수 있습니다. – Tomek

1

: 비표준 확장을 사용하지 않으려면

1

은 (.NET 2003)이 작동 :

#if defined(DETAILED_DEBUG) 
#define DBGPRINT fprintf 
#else 
__forceinline void __DBGPRINT(...){} 
#define DBGPRINT __DBGPRINT 
#endif