사용자의 선호도에 따라 필터링하는 wrapper printf 기능
내 프로그램은 로그와 stdout에 씁니다.그러나 모든 메시지에는 특정 우선 순위가 있으며 사용자는 기본 설정에서 어떤 우선 순위가 어떤 스트림(log 또는 stdout)으로 이동할지를 지정합니다.
unsigned short PRIO_HIGH = 0x0001;
unsigned short PRIO_NORMAL = 0x0002;
unsigned short PRIO_LOW = 0x0004;
기본 설정은 일부 플래그로 처리됩니다.
unsigned short PRIO_LOG = (PRIO_HIGH | PRIO_NORMAL);
unsigned short PRIO_STD = (PRIO_HIGH);
그write_log
function은 printf function과 동일한 parameter와 함께 작동해야 하며, printf function과 추가된 parameterunsigned short priority
.
write_log((PRIO_NORMAL|PRIO_LOW), "HELLO %s, take %d", "World", 1);
(비록 그렇다 하더라도)PRIO_NORMAL|PRIO_LOW
말이 안 됩니다.)
플래그를 쉽게 확인할 수 있습니다.if(priority & PRIO_LOG)
(두 인수 모두에 플래그가 설정되어 있으면 >1을 반환합니다.)
그러나 문자열 리터럴과 형식 인수를 printf 함수에 전달하는 방법을 찾을 수 없습니다.(동일한 효과를 달성하는 대체 방법에 대해 가능한) 포인터를 도와주거나 줄 수 있는 사람?대단히 감사하겠습니다.
C의 변수 인수 "vargs" 기능을 사용하여 printf() 대신 vprintf()를 호출하려고 합니다.
#include <stdarg.h>
int write_log(int priority, const char *format, ...)
{
va_list args;
va_start(args, format);
if(priority & PRIO_LOG)
vprintf(format, args);
va_end(args);
}
자세한 내용은 이 항목을 참조하십시오.
Jeff의 아이디어가 바람직한 방법이라고 생각하지만 vprintf를 사용하지 않고 매크로로 이를 수행할 수도 있습니다.이를 위해서는 gcc가 필요할 수 있습니다.
#define write_log(priority,format,args...) \
if (priority & PRIO_LOG) { \
printf(format, ## args); \
}
이것이 어떻게 작동하는지에 대한 정보는 여기에서 확인하세요.
PRIO_* 정의를 비트로 사용하려면( | 및 & 사용) 각 정의에 고유한 비트를 지정해야 합니다.
unsigned short PRIO_HIGH = 0x0001;
unsigned short PRIO_NORMAL = 0x0002;
unsigned short PRIO_LOW = 0x0004;
(0) 표기를 사용하는 동안 do {}을(를) 사용하여 매크로를 개선할 수 있습니다.write_log에 대한 호출이 문장처럼 작용합니다.
#define write_log(priority,format,args...) do { \
if (priority & PRIO_LOG) { \
printf(format, ## args); \
} while(0)
언급URL : https://stackoverflow.com/questions/1516370/wrapper-printf-function-that-filters-according-to-user-preferences
'source' 카테고리의 다른 글
무언가를 확인하는 것이 자바스크립트에서 비어 있습니까? (0) | 2023.10.04 |
---|---|
@change에서 Vue.js get selected 옵션 (0) | 2023.10.04 |
type constchar* 인수가 type "LPCWSTR" 매개 변수와 호환되지 않습니다. (0) | 2023.10.04 |
그릴 수 있는 색을 프로그래밍 방식으로 변경 (0) | 2023.10.04 |
즉시 실행할 때마다 커밋이 필요합니까? (0) | 2023.10.04 |