Можно, но я думаю, что было бы лучше использовать возможность 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"
В противном случае, если вы решите использовать макросы для указания ширины поля, вы получите нежелательное поведение (как описано в Какие приложения оператора ## препроцессора и какие ошибки следует учитывать? ).