C宏生成printf格式的字符串

时间:2010-10-24 20:15:29

标签: c macros printf c-preprocessor

是否可以编写一个返回printf格式的宏(使用标记串联)? E.g。

#define STR_FMT(x) ...code-here...

STR_FMT(10)扩展为"%10s"

STR_FMT(15)扩展为"%15s"

... 等

这样我就可以在printf中使用这个宏了:

printf(STR_FMT(10), "*");

2 个答案:

答案 0 :(得分:12)

您可以,但我认为使用printf()功能必须动态指定字段大小和/或精度可能更好:

#include <stdio.h>

int main(int argc, char* argv[])
{
    // specify the field size dynamically
    printf( ":%*s:\n", 10, "*");
    printf( ":%*s:\n", 15, "*");

    // specify the precision dynamically
    printf( "%.*s\n", 10, "******************************************");
    printf( "%.*s\n", 15, "******************************************");

    return 0;
}

这样做的好处是不使用预处理器,也可以让你使用变量或函数来指定字段宽度而不是字面值。


如果您决定使用宏,请间接使用#运算符(如果您在其他地方使用,请使用##运算符),如下所示:

// macros to allow safer use of the # and ## operators
#ifndef STRINGIFY
#define STRINGIFY2( x) #x
#define STRINGIFY(x) STRINGIFY2(x)
#endif

#define STR_FMTB(x) "%" STRINGIFY(x) "s"

否则,如果您决定使用宏来指定字段宽度,则会产生不良行为(如What are the applications of the ## preprocessor operator and gotchas to consider?中所述)。

答案 1 :(得分:7)

#define STR_FMT(x) "%" #x "s"