我有一些 mql5 代码,如果设置了DEBUG
宏,我想打印调试消息。我想为这些调试消息使用不同的函数(DebugPrint
)。我的第一次尝试是创建一个常规函数,但变量参数似乎不起作用。然后,我尝试使用预编译器删除基于此答案的DebugPrint
调用,但是编译器的预处理器似乎也不理解变量参数列表。这是我尝试过的代码:
#ifdef DEBUG
#define DebugPrint(...)
#else
#define DebugPrint(...) Print(__VA_ARGS__)
#endif
关于如何实现我想要做的事情的任何想法?
我在 MQL4/5 上的几美分:
预处理器指令:
虽然修订后的New-MQL4.56789
编译器为预处理器指令语法打开了一些新的、更复杂的结构#define
但我在尝试在生产代码中使用它们时几乎总是烧伤手指。
可变参数:
MQL4/5 是一种强类型的编译语言,因此不提供可变参数函数的方法。使用一些最近的语法辅助工具,来自(OOP)基于类的函数(方法)调用接口覆盖,并且可能使用来自所谓的函数template
-s的一些高级抽象,有机会为您的#define
依赖行为创建某种语法支持。
函数重载、
template
-s
和
typename
依赖的操作:
虽然这些技术为MQL4/5软件领域带来了更多的"新">编译器功能,但额外的复杂程度并不能证明这些努力是合理的,因为由此产生的原理在export
、virtual
或#import
结构的使用
那么如何做到这一点呢?
好吧,为了快速和迭代的开发需求,人们可以诉诸">几乎可变">PrintFormat( DEBUG_MASK, ..., ..., ... );
,将上下文完全(已知)匹配的属性集与静态的、特定于上下文的#define
DEBUG_MASK
一起使用。FormatString( MASK_A, par1, par2[, FormatString( MASK_B, par3, par4[, FormatString( ... )[, ... ] )[, ... ])
的嵌套结构留给自己的想象。