I have some mql5 code which I want to print debug messages if the DEBUG
macro is set. I would like to use a different function (DebugPrint
for that matter) for those debug messages. My first attempt was to create a regular function, but variable arguments don't seem to work. I then tried to use the precompiler to remove the DebugPrint
-calls based on this answer, however the compiler's pre-processor doesn't seem to understand the variable argument list either. This is the code I tried:
#ifdef DEBUG
#define DebugPrint(...)
#else
#define DebugPrint(...) Print(__VA_ARGS__)
#endif
Any ideas on how to achieve what I'm trying to do?
My few cents on MQL4/5:
Preprocessor directives:
while the revised New-
MQL4.56789
compiler has opened some new, more complex constructs for#define
preprocessor directives syntax, I have almost always burnt my fingers when trying to use them in production code.Variadic arguments:
MQL4/5 is a strong-typed, compiled language and as such does not provide means for variadic functions. With some recent syntax aids, coming from ( OOP ) Class-based function ( method ) call-interface overrides and maybe using some advanced abstractions from so called function-
template
-s, there are chances to create some sort of syntax-support for your#define
-dependent behaviour.Function Overloading,
template
-sand
typename
-dependent actions:Whereas these techniques have brought even more "New" compiler features into the MQL4/5 software domain, the additional levels of complexity do not justify the efforts, given the resulting principles are restricted from being usable in cases where their use is restricted from
export
,virtual
or#import
constructs.So how to make this work?
Well, for the sake of the rapid & iterative development needs, one may resort to an "almost-variadic"
PrintFormat( DEBUG_MASK, ..., ..., ... );
using a context-full (known) matching set of attributes against a static, context-specific#define
-edDEBUG_MASK
. Nested construction ofFormatString( MASK_A, par1, par2[, FormatString( MASK_B, par3, par4[, FormatString( ... )[, ... ] )[, ... ])
are left for one's own kind imagination.