C宏生成printf格式的字符串

And*_*anu 4 c macros printf c-preprocessor

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

#define STR_FMT(x) ...code-here...
Run Code Online (Sandbox Code Playgroud)

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

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

...等

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

printf(STR_FMT(10), "*");
Run Code Online (Sandbox Code Playgroud)

Mic*_*urr 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;
}
Run Code Online (Sandbox Code Playgroud)

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


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

// 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"
Run Code Online (Sandbox Code Playgroud)

否则,如果您决定使用宏来指定字段宽度,则会出现意外行为(如##预处理程序运算符的应用程序和要考虑的内容中所述).

  • +1 提及“%*”,并发现 OP 可能想要将变量而不是编译时常量传递给该宏。 (2认同)