source

사용자의 선호도에 따라 필터링하는 wrapper printf 기능

ittop 2023. 10. 4. 22:59
반응형

사용자의 선호도에 따라 필터링하는 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_logfunction은 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

반응형