错误、漏洞、问题 - 页 1017

 
A100:

简而言之,你不能在.mqh中定义一个函数实现,并在任何.ex5中顺利使用它。

:)

但是,当你用一个.ex5来调用 另一个.ex5上的函数时,即使该名称的函数存在于两个.ex5中,你也必须确保你准确地指定命名空间。也就是说,理论上,::In()应该能解决问题。 而如果不能--这是一个需要修复的错误。

Документация по MQL5: Основы языка / Функции / Вызов функции
Документация по MQL5: Основы языка / Функции / Вызов функции
  • www.mql5.com
Основы языка / Функции / Вызов функции - Документация по MQL5
 

让我们停止使用ServiceDesk的答案。

"当编译1.mq5时,在函数B()里面,不清楚应该调用哪个函数,
imported A()还是exported A() - 因为编译器不明白你是指同一个函数"

他们在形式上是对的--但如果你想的话,编译器可以(而且应该)被告知这是同一个函数,因为我重复编译时的模块名称是可用的(在#import中指定)。

更有甚者,如果你先把:: 放在一个地方并进行编译,然后删除并把:: 放在另一个地方--一切都能正常工作,但你必须同意--这非常不方便,在经过10-15次这样的强制排列组合后,我改用#define

 
A100:

让我们停止使用ServiceDesk的答案。

"在编译1.mq5时,在B()函数里面,不清楚应该调用哪个函数。

导入A()或导出A()--因为编译器不理解你是指同一个函数"

绝对的,事情就是这样的。


它们在形式上是正确的--但如果需要的话,编译器可以(也应该)告诉它是同一个函数,因为我重复了模块名称在编译时是可用的(在#import中指定)。

对于这样的提示,有一个上下文解析操作符"::",但它在这种情况下不适用,因为模块(文件)名称也是一样。

建议是充分的--改变计划的结构。

更重要的是,如果你先在一个地方放上::并进行编译,然后删除并在另一个地方放上::,一切都能正常工作,但你必须同意,这非常不方便。

最好避免这种伎俩。 它不仅不方便,而且是 "不正确的种族"、"不合适的"、"丑陋的 "和 "在鼻涕上"。 只有在没有其他选择来实现你想要的东西时,欺骗编译器的企图才有权利存在。 在这种情况下,有很多。


在经历了10-15次这样的强制排列组合后,我改用#define

参数化的定义只有在类型感应不理想或参数被 "冗长 "的文本块取代时才有用。 作为内联函数的替代品,定义无疑对程序的健康是有害的。

--

在你的情况下,我会拒绝使用.ex5库,一切都可以正常工作。 它们唯一的实际用途是在隐藏实现(销售时),我没有看到它们在其他情况下的用途。

你在为销售而写作吗?

 
MetaDriver:

你在为销售而写作吗?

就我自己而言。

没有.ex5,我做不到。我也有像F( string& [] ) 这样的函数,它们不知为何不适合放在.dll中 :)

也许可以通过分离器推动它们,但我还没有试过。

 
A100:
MQL5只是没有内联函数(在表单中),我使用参数化的宏来代替,这并不完全正确,因为没有类型控制。

另外,编译器不对表达式进行优化,所以会有额外的速度损失。你最好检查一下。

顺便说一下,关于内联 - 它是有效的。因为它,我在调试器方面遇到了一些问题。

 
TheXpert:

顺便说一下,关于内联的问题 -- 它是有效的。因为它,调试器也出现了问题。

所以它在编译器层面上起作用。我希望它能在语言层面上工作。 我在上面举了一个例子--一切都通过莫名其妙的 "绕过编译器 "工作,而直接工作则需要额外的步骤,有时是显著的,因为正如你所建议的,不在一个文件中包括一个相同功能的描述和实现当然是可能的,但随后10个完整的.mqh被分解成100个小.mqh

我还没有追逐速度。最主要的是方便,代码量不会成倍增长

我甚至面临着在MQL5中使用#if #else类似物的必要性(到目前为止有点棘手,但在这里和那里都可以使用)。

 
A100:

我还不追求速度。最主要的是方便,代码量不会成倍增长。

这取决于你。但考虑到对元引号的病态喜爱,你用这样的宏抓到一两个耙子的概率远非零。
 

A100:

没有.ex5,它就不能工作。我也有像F( string& [] ) 这样的函数,但它们不适合放在.dll中 :)

....

天啊...:)

我并没有建议用DLL代替.ex5库,只是用很多很多的.mqh和一个可执行的.mq5,没有别的。

 
MetaDriver:

只有很多很多的.mqh和一个可执行的.mq5,没有别的。

我在3个不同的终端上使用一个代码,这意味着至少有一个.ex5(所有人共享)必须是。如果是这样的话--那么又回到了上面描述的问题--只有两个模块--但它们不能正常编译。
 
ChartGetInteger( chart_ID, CHART_BRING_TO_TOP, 0, true )
ChartGetInteger( chart_ID, CHART_BRING_TO_TOP, true )
它在非交易时间不工作。是什么阻止了你在非交易时间将时间表放在所有其他时间表之上?