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