是否可以编写一个返回printf格式的宏(使用标记串联)? E.g。
#define STR_FMT(x) ...code-here...
STR_FMT(10)
扩展为"%10s"
STR_FMT(15)
扩展为"%15s"
... 等
这样我就可以在printf中使用这个宏了:
printf(STR_FMT(10), "*");
答案 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"