簡體   English   中英

C語言巨集

[英]Macros in C language

我今天在gnu99中使用此宏,但我想根據我的項目要求更改此宏以支持-c99

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

我可以將上面的宏轉換為下面的內容,但最終我不知道如何使用str。

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

    } while(0)

有人可以幫我嗎?

如果要實現返回字符串(而不是字符數)的sprintf實現,請不要使用宏。 編寫一個帶有短字符串循環緩沖區的short函數:

#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;
}

您需要這里的<stdarg.h>函數來實現自己的printf的函數。 vsnprintf類似於snprintf ,除了它需要一個va_list

8個static char緩沖區的循環緩沖區使您可以返回沒有分配的字符串。 當然,您一次最多可以使用8個fmt調用,例如在一個printf調用中。

您認為過於復雜,只需使其成為一個表達式,然后在外部定義緩沖區即可:

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

使用STR_USE; 在任何范圍內,您可能都想調用STR ,並像以前一樣使用STR

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM