빠르고 더러운 출력에 사용하는 디버그 매크로가 있습니다. gcc 5.4에서 코드를 깔끔하게 컴파일하는 방법을 결정하려고 노력했습니다. 이전 버전의 gcc (4.x) 또는 clang (11.0.3)에서는 문제가 발생하지 않습니다. 오류는 다음과 같습니다.
main.c: In function ‘main’:
main.c:4:38: warning: too many arguments for format [-Wformat-extra-args]
do { if (1){ fprintf(stdout, "debug:%s:%04d:%s: " fmt, __FILE__, \
^
main.c:10:2: note: in expansion of macro ‘DEBUGPRINT’
DEBUGPRINT("How to have no arguments?\n", NULL);
이 문제를 해결하는 방법을 결정하는 데 사용했던 코드는 다음과 같습니다.
#include <stdio.h>
#define DEBUGPRINT(fmt, ...) \
do { if (1){ fprintf(stdout, "debug:%s:%04d:%s: " fmt, __FILE__, \
__LINE__, __func__, __VA_ARGS__);} } while (0)
int main(int argc, char *argv[])
{
DEBUGPRINT("nums: %04i, %04i\n", 0x1234,0x5678);
DEBUGPRINT("How to have no arguments?\n", NULL);
return(0);
}
보시다시피 내가 논쟁이 있으면 문제가 없습니다. 인수가없는 메시지가있는 경우에만 가능합니다. '% s'와 함께 "\ n"을 전달할 수 있다고 생각하지만 NULL을 처리하는 방법이 있는지 궁금합니다.
인수를 갖지 않으려면 다음을 수행 할 수 있습니다.
#include <stdio.h>
/* SEPARATE THE COMMA FROM THE __VA_ARGS__ macro with
* the ## token */
#define DEBUGPRINT(fmt, ...) \
do { if (1){ fprintf(stdout, "debug:%s:%04d:%s: " fmt, __FILE__, \
__LINE__, __func__,## __VA_ARGS__);} } while (0)
/* THIS TOKEN ELIMINATES THE COMMA ------------^^ */
int main(int argc, char *argv[])
{
DEBUGPRINT("nums: %04i, %04i\n", 0x1234,0x5678);
DEBUGPRINT("How to have no arguments?\n");
return(0);
}
나는 표준에 포함되어 있지 않지만 CLANG 및 GCC 컴파일러가 공유하는 확장입니다.
이것은 내 시스템의 출력입니다.
$ a.out
debug:pru3225.c:0012:main: nums: 4660, 22136
debug:pru3225.c:0013:main: How to have no arguments?
$ _
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다