2012-08-25 4 views
0

varargs에 일부 값 (char *)이 포함되어 있는지 확인하는 간단한 API가 있습니까?C++ varargs가 포함되어 있는지 확인하십시오.

단순한 API가 없다면 args를 계산하지 않고 어떻게 반복해야합니까?

내 방법은 구성 IP에서 로그 기반을 필터링 할 수 있어야하므로 args 중 하나가 10.3.2.2 (일부 구성 IP)인지 확인해야합니다.

void Logger::Log(const char *format, ...) { 
    lock_guard<mutex> guard(mtx_); 
    if (!file_) { 
     file_ = fopen("application.log", "w"); 
    } 
    time_t current = time(0); 
    tm *ptm = localtime(&current); 
    stringstream ss; 
    ss << "\n[" << ptm->tm_min << ":" << ptm->tm_sec << "]"; 
    fprintf(file_, ss.str().data()); 
    va_list argptr; 
    va_start(argptr, format); 
    vfprintf(file_, format, argptr); 
    va_end(argptr); 
    fflush(file_); 
} 

주어진 인수의 길이와 유형의 반복 만이 lesson에 표시를 찾고 있습니다. 형식이며 검사 포함이 고가이며 로거가 고성능 요구 사항을 지원할 수 있어야합니다.

내 목표는 간단한 로거 방법을 구현하는 것입니다. 그래서 당신은 이것을 다음과 같이 부를 것이다 :

Log("trafic from ip %s to ip %s", "10.1.1.1","1.1.1.1") 

그리고 많은 다른 호출. 필터에서 매개 변수 값 중 하나가 "10.1.1.1"(예 :)인지 확인하고 싶지 않으므로 기록하지 마십시오.

+1

아니요, C++에서는이 작업을 수행하는 것이 없습니다. – tenfour

+0

레슨에서 길이 만 주어지면 반복하는 것입니다. 이 예에서는 모든 매개 변수가 두 배로 지정되었습니다.당신은 인수의 유형과 길이가 필요합니다. 이것은 귀하의 경우 큰 문제입니다. –

+0

@DavidSchwartz 당신이 정확합니다. 나는 심지어 길이가 없다는 것을 의미한다. –

답변

2

varargs의 유형을 알기위한 보편적 인 방법이 없으므로 구문 해석기가 없습니다. 형식을 알지 못하면 값을 얻을 수 없습니다. 따라서 함수가 인수의 유형을 아는 방식에 따라 코드를 작성해야합니다.

는이 작업을 수행 할 :

  1. stringstream에 전체 로그 메시지를 조립합니다.

  2. 원하는 문자열에 대한 로그 메시지를 확인하십시오.

  3. 문자열이있는 경우 이 아니고이 아니며 앞뒤에 숫자가 있어야합니다.

  4. 문자열을 찾았 으면 앞뒤에 숫자가 없으면 로그인하십시오.

당신은 "foo는 2.3.4.51 바"처럼 마지막 검사가 있기 때문에 "foo는 바 12.3.4.5 바즈"이 "2.3.4.5"을 포함해야합니다. 따라서 문자열을 찾고 숫자가 뒤따라 지거나 계속 나타나면 여전히 메시지를 기록하고 싶습니다.

+0

형식 문자열을 구문 분석해야하는데 코드 작성이 매우 어려워 질 것입니다. 함수가 취할 수있는 모든 형식 지정자를 이해하고 올바르게 처리해야하고, 필요한 인수 유형 (있는 경우)을 파악하고이를 varargs에서 건너 뜁니다. 모퉁이에 자신을 그린 상태에서 디자인을 재검토하거나 "충분히 좋은 희망"을 취하고 임시 버퍼의 출력을 strstr로 가져와야합니다. –

+0

당신이 말했듯이 format은 include가 비쌀 수 있으며 로거는 엄격한 성능 요구를 처리해야합니다. –

+0

당신은 구석에 자신을 그렸습니다. 디자인을 백업하고 수정하십시오. –

3

아니요. 그리고 어쨌든 당신은 C++에서 varargs를 사용해서는 안되며, 대신 variadic 템플릿을 사용하십시오.

-1

글쎄, 아니, 가변 인수 목록에 대한 색인 액세스가 없습니다. 항목별로 항목 만 표시하므로 루프를 반복해야합니다. 그게 vprintf 등이 작동하는 방법입니다. 아이템을 반복 할 때 얼마나 많은 아이템이 있는지, 보통 어떤 타입이 있는지를 알아야합니다. vprintf 등의 경우 형식 문자열에 형식 지정자가있는 수만큼의 항목이 있어야하며 각 형식 지정자는 예상되는 인수 유형을 알려줍니다. 채택 할 수있는 또 다른 규칙은 인수 목록의 끝을 표시하기 위해 센티널 값을 사용하는 것입니다. 포인터리스트와 같은 동질의리스트의 경우, 널 포인터는 실행 가능한 센티널이 될 수 있습니다.

관련 문제