Vous pouvez, mais je pense qu'il pourrait être préférable d'utiliser la capacité printf()
doit spécifier la taille du champ et/ou précision dynamique:
#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;
}
Ceci a l'avantage de ne pas utiliser le préprocesseur et sera également laissez-vous utiliser des variables ou des fonctions pour spécifier la largeur du champ au lieu des littéraux.
Si vous décidez d'utiliser des macros à la place, s'il vous plaît utiliser l'opérateur #
indirectement (et l'opérateur ##
si vous l'utilisez ailleurs) comme ceci:
// 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"
Sinon, si vous décidez d'utiliser des macros pour spécifier la largeur du champ, vous obtiendrez un comportement indésirable (comme décrit dans What are the applications of the ## preprocessor operator and gotchas to consider?).
Je l'avouerais deux fois si je le pouvais. –
+1 pour mentionner '% *', et déterminer que OP souhaite probablement transmettre des variables et non des constantes de compilation à cette macro. –