如何定义指向同名静态类方法的全局宏



我有以下MQL4/5代码:

class MQL4 {
public:
static double Ask() {
MqlTick _tick;
SymbolInfoTick(_Symbol, _tick);
return _tick.ask;
// Overriding Ask variable to become a function call.
#define Ask MQL4::Ask()
}
};
void start() {
double ask = Ask; // line 14
};

然而,根据错误,它无法在MQL4或MQL5下编译:

> mql /s /mql5 Test.mqh
MQL4/MQL5 Compiler build 1162 (02 Jul 2015)
Test.mqh : information: Checking 'Test.mqh'
Test.mqh(14,16) : error 320: 'Ask' - too complex, simplify the macro
Test.mqh(14,16) : error 239: '::' - syntax error
Test.mqh(14,16) : error 239: '::' - syntax error
Test.mqh(14,16) : error 239: '::' - syntax error
Test.mqh(14,16) : error 239: '::' - syntax error
Test.mqh(14,16) : error 239: '::' - syntax error
Test.mqh(14,16) : error 239: '::' - syntax error
Test.mqh(14,16) : error 239: '::' - syntax error
Test.mqh(14,16) : error 149: unexpected token
Test.mqh(14,16) : error 149: ')' - unexpected token
Test.mqh(14,16) : error 157: 'MQL4' - expression expected
Test.mqh(14,10) : warning 31: variable 'ask' not used
: information: Result 11 error(s), 1 warning(s)

与最新的1498版本相同的错误

基本上是说Ask宏是一个过于复杂的宏。虽然当我将Ask()方法重命名为GetAsk()并更新宏定义时,它运行良好,但
我想了解
是否有其他解决方案而无需重命名。

有没有任何语法可以定义一个宏替换,它可以理解以下宏:

#define Ask MQL4::Ask()

而不必重命名它,同时仍将其保留在静态类方法中?

是的,但是。。。,不
#define替换效果不错,但是
但是Ask是一个保留字,这会混淆编译器

问题实际上是编译器预处理器的能力有限,而不是.method()的"同名"。

#define指令的非参数和参数替换功能已在已发布的MQL4/5语言语法的限制下进行了测试。


结语:

由于我在其他一些MQL4帖子的某个地方发布了,在对基于#define指令的预编译器替换(用于版本管理等目的)的可用功能进行了一些广泛的测试后,我只能得出一个结论,试图避免使用此功能,因为由此产生的问题远比预期的目的更昂贵(令人惊讶的字符串处理限制、持续的语言爬行的不确定性、下一个Build版本后语法糖技巧的不可预测结果等)。

宏替换应该在远离函数的地方声明。尝试将#define Ask MQL4::Ask()移到类声明上方或程序的第一行

UPD。经过交谈,发现宏应该有不同的名称。

#define method (Class::method()) //doesnt work, 
#define method (Class::Method()) //or (Class::method_()) is fine

最新更新