Comment imiter la macro variadic dans VC ++ 6.0?

Dans VS2010 , j’ai écrit les macros variadiques suivantes pour transférer des informations dans des fichiers.

#define INDENT(fp, indent) for(size_t __i = 0; __i < (indent); ++__i) fprintf((fp), " ") // IND_FP = indented fprintf. // This macro uses two IMPLICIT parameters. // 1. (FILE *)fp is a pointer to the output file. // 2. (size_t)indent specifies the indentation level. #define IND_FP(format, ...) do{ INDENT(fp, indent); fprintf(fp, format, __VA_ARGS__); }while(0) 

Ces macros apparaissent fréquemment dans mon programme.

 void CMAP::dump_info(FILE *fp, size_t indent){ IND_FP("\n", table_version_number, num_encoding_tables); //... IND_FP("\n"); } 

Malheureusement, je dois maintenant migrer mon code vers l’IDE antédiluvien VC ++ 6.0 , qui ne prend PAS en charge les macros variadiques. J’ai écrit une fonction variadic à la place.

 void IND_FP(FILE *fp, size_t indent, char *format, ...){ INDENT(fp, indent); va_list arg_ptr; va_start(arg_ptr, format); vfprintf(fp, format, arg_ptr); va_end(arg_ptr); } 

Mais je dois changer les dizaines, voire les centaines de lignes de code de IND_FP(format, ...) à IND_FP(fp, indent, format, ...) .

Y a-t-il une astuce de macro qui puisse m’aider? Ou je ferais mieux d’utiliser des arguments explicites et de m’habituer à la redondance?

Vous pouvez éviter les variadiques en ne les utilisant pas. Utilisation ofstream au lieu de FILE *. Quelque chose comme ça

 #define LOGGER(logfile,loginfo) logfile << loginfo << std::endl 

Supposons que vous ayez déclaré un fichier journal appelé ofstream. Pour des choses simples, vous pouvez utiliser

 LOGGER(logfile, x); 

Si vous souhaitez devenir plus complexe, vous pouvez utiliser

 LOGGER(logfile, "x = " << x << " b=" << b); 

Pour le retrait, vous pouvez utiliser un global

 // declaration char spaces[128]; ... // Initialization memset(spaces, ' ', sizeof(spaces)); #define LOGGER(logfile,indent,loginfo) \ spaces[indent] = '\0'; \ logfile << spaces << loginfo << std::endl; \ spaces[indent] = ' ' 

Donc, de la même manière, si vous souhaitez mettre en retrait de 3

 LOGGER(logfile, 3, "x=" << x << " y=" << y << " z=" << z); 

C ++ << n’est pas aussi élégant que printf pour le formatage, mais il vous aidera à résoudre le problème de l’utilisation des variadiques.

 #define IND_FP Logger(indent) class Logger { public: Logger(int indent); int operator()(FILE* fp, char* format, ...); private: // an exercise for the reader }; 
 FILE *g_fp; size_t g_indent; void ind_fp(char *format, ...){ INDENT(g_fp, g_indent); va_list arg_ptr; va_start(arg_ptr, format); vfprintf(g_fp, format, arg_ptr); va_end(arg_ptr); } #define IND_FP (g_fp = fp, g_indent = indent, &ind_fp) 

Cela pourrait fonctionner pour votre situation.