내가 아는 한, gcc에서 다음과 같은 것을 쓸 수있다.Visual C++에서 가변 인수 목록을 사용하여 매크로를 작성하는 방법이 있습니까?
#define DBGPRINT(fmt...) printf(fmt);
VC++에서 그렇게 할 수있는 방법이 있습니까?
내가 아는 한, gcc에서 다음과 같은 것을 쓸 수있다.Visual C++에서 가변 인수 목록을 사용하여 매크로를 작성하는 방법이 있습니까?
#define DBGPRINT(fmt...) printf(fmt);
VC++에서 그렇게 할 수있는 방법이 있습니까?
예 만 사람 VC++ 2005 구문 귀하의 예는 다음과 같습니다 :
#define DBGPRINT(fmt, ...) printf(fmt, __VA_ARGS__)
전체 참조는 here입니다.
거의. 그것은 그 생각보다 못 생겼어 (그리고 당신은 아마 매크로 자체가 뒤에 세미콜론을 원하지 않는 :
#define DBGPRINT(DBGPRINT_ARGS) printf DBGPRINT_ARGS // note: do not use '(' & ')'
그것을 사용하려면 :
DBGPRINT(("%s\n", "Hello World"));
는 (괄호 한 쌍의 누락되었다).
모든 악재는, 원래의 질문이 VC++의 버전을 명시하지 않았고, 가변 인자 매크로를 모든 컴파일러에서 지원하지 않는 이유는 확실하지.
이예, 당신은 비주얼 스튜디오 C에서이 작업을 수행 할 수 있습니다 ++ 2005 이상 버전 (VS 2003은 확실하지 않음). VA_ARGS을 살펴보십시오.
#define DBGPRINTF(fmt, ...) printf(fmt, __VA_ARGS__)
을하고 매크로 변수의 인수는 그 다음 우리가 그들을 구문 분석 va_args 수 '...'인수로 제공되는 함수에 전달 얻을 것이다 : 당신은 기본적으로 같은 것을 할 수 있습니다.
VA_ARGS 및 매크로 사용과 관련된 이상한 동작이있을 수 있습니다. VA_ARGS이 가변적이기 때문에 0 인수가있을 수 있습니다. 그러면 의도하지 않은 후행 쉼표로 나갈 수 있습니다.
VC++은 인수가 없으면 후행 쉼표를 사용합니다, 그렇지 않습니까? –
라고 당신이 찾고있는 [가변 인자 매크로 (http://msdn.microsoft.com/en-us/library/ms177415(VS.80).aspx)
링크의 요약 :.. 예, VC++ 2005에서 최대에
작업해야 다음 (Variadic macros에 링크를 참조하십시오.)는
(아래 예는 고정 및 가변 인자를 나타낸다.)
# define DBGPRINTF(fmt,...) \
do { \
printf(fmt, __VA_ARGS__); \
} while(0)
MSDN의 "VA_ARGS"및 va_list를 검색하십시오! 실제로 __FILE__
, __LINE__
, 토큰 매크로 기능 (어떤이 필요하지 않은 경우
#define DBGPRINT(args) printf(args);
DBGPRINT(("%s\n", "Hello World"));
, 당신은 별도의 브라켓을 제공했습니다 -pasting, etc.) stdargs.h
을 사용하여 variadic 함수를 작성하는 것이 좋습니다. printf()
을 호출하는 대신 variadic 함수는 가변 인수 목록을 전달하기 위해 vprintf()
을 호출 할 수 있습니다.MSVC 7.1
이것은 너무 잘못되었습니다,하지만 upvotes있어 ... 나는 정의의 끝에 혼자 세미콜론에 대한 사람을 해고 것입니다. 당신이 의도 한 것 :'#define DBGPRINT (args) printf args' ...하지만이 경우 단지'#define DBGPRINT printf'가 할 것입니다. –
#define DBGPRINT printf는 실행 파일에서 모든 디버깅 출력 코드를 삭제하려는 경우 수행하지 않습니다. 모든 (...) 매개 변수 목록이 남아있을 것이고 적어도 경고를 유발하고 오류 및 예기치 않은 부작용을 유발할 수 있습니다. – Tomek
: 비표준 확장을 사용하지 않으려면
은 (.NET 2003)이 작동 :
#if defined(DETAILED_DEBUG)
#define DBGPRINT fprintf
#else
__forceinline void __DBGPRINT(...){}
#define DBGPRINT __DBGPRINT
#endif
을 현저이의 더 잘못된 버전 위에있어 최대하지만 누락 된 괄호가 ...이 파손 된 것을 의미하기 때문에 Persumably downvotes이었다 5 upvotes. 여러분 모두 간단한 '#define DBGPRINT printf'를 놓쳤습니다. –