I had almost forgotten about macro variadic … until I needed it. When a macro (or function) is declared with a variable number of arguments then this macro is called variadic. The syntax in order to define macro is similar to that of a function (__VA_ARGS__) :
#define eprintf(…) fprintf (stderr, __VA_ARGS__)
Where the 3 dots (…) are replaced with __VA_ARGS__ at runtime.
EXAMPLE of macro :
#define NAMEOFMACRO1(...) fnc (__VA_ARGS__) //if there is a single mandatory variable (x) and after a variable number of arguments then #define NAMEOFMACRO2(x,...) fnc (x,__VA_ARGS__)
When you invoke the macro : NAMEOFMACRO2(a,b,c,d) the token b,c,d replaces the “placeholder” __VA_ARGS__
#define NAMEOFMACRO2(x,...) fnc (x,__VA_ARGS__) NAMEOFMACRO2("a",b,"c",12) Transfrormed to fnc("a",b,"c",12) NAMEOFMACRO2("a","c",12) Transfrormed to fnc("a","c",12) NAMEOFMACRO2("a") Transfrormed to fnc("a", )
If you need more details see here :
http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html#Variadic-Macros
#1 LOG MACRO
I used variadic for “LOG macro” with objective-c … an example of use is below :
#defile LL_ERROR 1 #defile LL_INFO 2 #defile LL_DEBUG 3
#define LOG_ERROR(...) if (logLev>=LL_ERROR) NSLog(@"ERROR %@,%@ - %@ @ (%@:%d)",@""__DATE__"",@""__TIME__"",[NSString stringWithFormat:__VA_ARGS__],@""__FILE__"",__LINE__); #define LOG_INFO (...) if (logLev>=LL_INFO) NSLog(@"INFO: %@,%@ - %@ @ (%@:%d)",@""__DATE__"",@""__TIME__"",[NSString stringWithFormat:__VA_ARGS__],@""__FILE__"",__LINE__); #define LOG_DEBUG(...) if (logLev>=LL_DEBUG) NSLog(@"DEBUG:%@,%@ - %@ @ (%@:%d)",@""__DATE__"",@""__TIME__"",[NSString stringWithFormat:__VA_ARGS__],@""__FILE__"",__LINE__);
Example :
...
setLogLevel(LL_DEBUG); //set variable logLev
...
LOG_DEBUG(@"Initialize client settings");
LOG_ERROR(@"Error getting key '%@' from configuration '%@' " ,key,configName);
Add Comment