2016-05-07 6 views
0

ich ein Makros definieren, die nur variable Zählwert fixiert drucken, zum Beispiel:Ein Makros, die Namen von Variablen und ihre Werte druckt

#define PRINT_PARAMS(param) std::cout << "test: " << std::string(#param) << " = " << param << "\n"; 

// using: 
int varI = 5; 
PRINT_PARAMS(varI); 

// output: 
test: varI = 5 

Wie ein Makros definieren, die so etwas tun:

PRINT_PARAMS(varI1, strValue2, floatValue3, doubleValue4); 

// output: 
varI1 = 5, strValue2 = some string, floatValue3 = 3.403f, .... 

Ich meine eine beliebige Anzahl von Eingabeparametern.

Antwort

3
#include <string> 
#include <iostream> 

//"for each" macro iterations 
#define FE_1(Y, X) Y(X) 
#define FE_2(Y, X, ...) Y(X)FE_1(Y, __VA_ARGS__) 
#define FE_3(Y, X, ...) Y(X)FE_2(Y, __VA_ARGS__) 
#define FE_4(Y, X, ...) Y(X)FE_3(Y, __VA_ARGS__) 
#define FE_5(Y, X, ...) Y(X)FE_4(Y, __VA_ARGS__) 
//... repeat as needed 

//the "for each" call 
#define GET_MACRO(_1,_2,_3,_4,_5,NAME,...) NAME 
#define FOR_EACH(action,...) \ 
    GET_MACRO(__VA_ARGS__,FE_5,FE_4,FE_3,FE_2,FE_1)(action,__VA_ARGS__) 

//function to print a single 
#define PRINT_SINGLE(param) std::cout << "test: " << std::string(#param) << " = " << param << "\n"; 

//function to print n amount 
#define PRINT_PARAMS(...) FOR_EACH(PRINT_SINGLE,__VA_ARGS__) 

int main(){ 
    std::string s1 = "hello"; 
    float f = 3.14; 
    int i = 42; 
    PRINT_PARAMS(s1,f,i) 

} 
2

Haben einen Compiler nicht zur Hand, aber frage mich, ob die folgende variadische Makro (oder zumindest helfen Ihnen eine Idee geben.) Funktionieren würde

#define PRINT_PARAMS(param) std::cout << "test: " << std::string(#param) << " = " << param << "\n"; 

#define PRINT_PARAMS(a, ...) { PRINT_PARAMS((a)); PRINT_PARAMS(__VA_ARGS__); } 
+0

, dass die folgende Art und Weise erweitern würde: ' {DRUCK_PARAMS ((var1)); PRINT_PARAMS (var2, var3, var4); } ' –

+0

@TrevorHickey - Ja, ich habe das erwartet und werde das dann wieder PRINT_PARAMS (a, ...) aufrufen? genau wie in der Vorlage Meta-Programmierung? Es ist schon lange her, dass ich ein variadisches Makro geschrieben habe, aber aus dem Aussehen deiner Antwort unten scheint dir viel Erfahrung zu sein :) – T33C

+0

Ah, ich wünschte, das wäre wahr, sonst wäre meine Antwort nicht so kompliziert gewesen. "Wenn die Erweiterung eines Makros entweder direkt oder über Zwischenmakros einen eigenen Namen enthält, wird es nicht erneut erweitert, wenn die Erweiterung nach weiteren Makros untersucht wird." –

Verwandte Themen