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.56789compiler has opened some new, more complex constructs for#definepreprocessor 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,virtualor#importconstructs.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.