2014-11-18 6 views
0
오늘 gnu99이 매크로를 사용하고

하지만 난 내 프로젝트 요구 사항매크로

#define STR(format, ...) ({static char str[256]; (void)snprintf(str, 256, format, ##__VA_ARGS__); str;}) 

내가 아래에 있지만 같은 뭔가 위의 매크로를 변환 할 수 있습니다에 따라 -c99 지원하기 위해이 매크로를 변경하려면 마지막에는 str을 사용하는 방법을 모른다.

#define STR(format, ...)       
    do                               
    {                               
     static char str[256];                  
     (void)snprintf(str, 256, format, ## __VA_ARGS__);     

    } while(0) 

누군가 나를 도와 줄 수 있습니까?

+1

C99 매크로에서 값을 반환하려면'do {...} while (0)'구문을 사용할 수 없습니다. –

+0

이것을 varargs 함수로 변환해야합니다. 우선 –

+0

매크로를 사용하여 이것을 달성하고자하는 이유는 무엇입니까? 그것은 절대적으로 함수의 의미입니다. – HuStmpHrrr

답변

0

는 단지 하나의 표현하게하고, 한 번 외부 버퍼를 정의

#define STR_USE static char str[256] 
#define STR(format, ...) (snprintf(str, sizeof str, format, ## __VA_ARGS__), str) 

사용 STR_USE;을 어떤 범위에 당신이 STR를 호출 할 수 있으며 이전 STR를 사용 .

1

sprintf 구현시 문자 수 대신 문자열을 반환하려면 매크로를 사용하지 마십시오. 대신 짧은 문자열의 순환 버퍼 짧은 함수를 작성 :

#include <stdlib.h> 
#include <stdio.h> 
#include <stdarg.h> 

#define MAX_FMT 8 

char *fmt(const char *format, ...) 
{ 
    static char buf[MAX_FMT][256]; 
    static int nbuf;  
    va_list va; 

    nbuf++; 
    if (nbuf == MAX_FMT) nbuf = 0; 

    va_start(va, format); 
    vsnprintf(buf[nbuf], 256, format, va); 
    va_end(va); 

    return buf[nbuf]; 
} 

int main() 
{ 
    printf("%40s\n%40s\n%40s\n", 
     fmt("%s: %d°C", "Copenhagen", 7), 
     fmt("%s: %d°C", "Paris", 10), 
     fmt("%s: %d°C", "Athens", 16)); 

    return 0; 
} 

당신은 당신의 자신의 printf -like 기능을 구현하기 위해 여기 <stdarg.h>의 기능이 필요합니다. vsnprintfsnprintf과 비슷하지만, va_list이 필요합니다.

순환 버퍼가 8 static 인 경우 char 버퍼를 사용하면 할당하지 않고 문자열을 반환 할 수 있습니다. 물론 한 번에 최대 8 회의 fmt 전화를 사용할 수 있습니다. 내부에 printf 전화. 당신은 너무 복잡하게 생각