错误、漏洞、问题 - 页 1016

 
A100:

是的,谢谢,我在简化源代码时犯了一个错误--现在我已经以不同的方式重写了这个错误

为了避免混淆,我删除了之前的那篇。

太可怕了,真的太可怕了,活在世上是多么可怕的事...

--

听着,这对你有什么好处? 如果没有秘密的话。

你用Lisp写你的顾问? 我向你致敬,但我建议你改用Haskell。

;-)

 
MetaDriver:

听着,你需要它做什么? 如果这不是什么秘密。

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

是的,我也使用它们,只是没有那么令人毛骨悚然的筑巢。))))

供你参考,mql5将所有的小函数翻译成内联替换,换句话说,我们可以假设每个用户定义的函数中都默认有关键字 "内联"。

替换宏或编译成函数的决定最终是由编译器做出的(顺便说一下,就像C++一样)。所以,试图用这种方式来加速是没有意义的,反正所有的简单函数都是内联的。

// 顺便说一句--有了类型控制!:)

 

MetaDriver:

作为参考,mql5将所有的小函数翻译成内联替换,换句话说--你可以假设每个用户函数中默认都有关键词 "内联"。

我不是想让它更快,而是为了方便。它们在本质上可能是内联的,但在形式上不是(!)。如果你在.mqh中定义inline,然后在几个.ex5中使用它,就会出现困难。我现在会试着找到这个链接

https://www.mql5.com/ru/forum/1111/page1013#comment_520221

int B() { return ( A( 0 ) ); }

1.mqh 中的B()应该是内联的--但所有这些--不能正常编译--只能单独编译。ServiceDesk提到电话的模糊性,没有深入到问题的本质,并建议以不同的方式组织项目。如何能以不同的方式进行?只有当我把B()的实现从.mqh删除到.ex5时,一切才会正常。那么什么是内联形式呢?

顺便说一下,在MQL4中,这个例子是有效的--没有错误,尽管B()事实上不是内联的,而是形式上的--内联。

 
A100:

而且我不是为了速度,而是为了方便。实质上,它们可能是内联的,但不是形式的(!)。

那么形式呢。

" 谁是Studebaker的人?这是你的Studebaker亲戚吗?你爸爸是Studebaker公司的?"

如果你在.mqh中定义inline,然后在几个.ex5中使用它,就会出现困难。

如果你不犯逻辑上的错误,并正确理解编译器的工作原理,就不会有任何困难。

我现在试着找一下链接

https://www.mql5.com/ru/forum/1111/page1013#comment_520221

这里的B()函数本质上是内联的

我还没有设法摆脱 "以相同的参数模糊地调用重载函数 "这样的错误--除非你把它放到一个单独的.ex5中,否则它们不会出现。

你在源代码层面上的递归基本上是不可识别的。 编译器很仁慈地对你皱起了眉头,就在优点上。你试图连接到inluder a libu,它定义了你正在编译的同一个inluder。那么你想要什么?如果你是一个编译器,你会怎么做?

这对你来说可能是个新闻,但是一个写在DLL中的内联函数绝对不能作为这个DLL之外的 宏来使用,//在运行时,源代码不再存在了。

我想给你的第二个消息是:mql(4, 5)中的所有lib都是动态链接的。这就是DLL的本质。

一句话:你实际上是想从一个lib指到它自己,指到它自己,指到它自己...... 等。

同意,如果都是无异议地编译,然后在运行时lib试图递归地加载自己,直到内存耗尽,那会更糟....。:))

?

这就是为什么在C/C++中会有内联关键字的原因

这根本不是原因。 我敢肯定,链接中的例子在C++中是无法编译的。

// 我懒得检查,这根本说不通。 如果我不明白如何构建递归组织的源代码,编译器也不会明白。

 
A100:

顺便说一下,这个例子在MQL4中是可行的--没有错误,尽管B()不是内联的,而是在形式上--内联的。

虽然......由于没有函数重载,也许编译器甚至没有尝试暗示不正确的重载--它只是愚蠢地忽略了重复的定义。
 
MetaDriver:
我不知道。虽然......由于那里没有函数重载,也许编译器并不试图暗示那里有错误的重载--它只是愚蠢地忽略了重复定义。

如果你在B()之前写内联,它可以在MQL4中编译(!),也可以在C/C++中编译。

那里根本就没有递归,事实上有

int A( int ) 和 #define B( ) A( 0 )

那里非常简单--如果你不太懒的话--用你的新脑袋看看--只是把函数的声明和实现分开 :)

 
A100:

1.mqh 中的B()应该是内联的--但所有这些都不能正常编译--只能单独编译。ServiceDesk提到了电话的模糊性,但没有深入到问题的核心,并建议以另一种方式组织项目。那还能怎样?

他只是自己回答。


只有当你从.ex5中的.mqh中删除B()的实现时,它才能发挥作用。那么什么是内联形式呢?

问题根本不在于内联B(),而在于它的重新定义。 由于lib是一个DLL,在重新编译1的过程中,它所包含的内联程序的信息(它们的名字)已经丢失。mqh(第一次编译是在lib形成的时候),所以在编译内联的时候,发现了重新定义的B()函数,由于参数相同,编译器认为这是一次错误的(不正确的)重载函数的尝试。 他完全有权利。 很有礼貌,他可以发誓不干。
 
MetaDriver:
你刚刚回答了你自己的问题。
这里的内联是正常的。 问题根本不在于B()的ineity,而在于它的重新定义。

只是C/C++理解(使用inline关键字)这不是一个重新定义,而MQL5不理解,尽管它可以通过编译模块的名称和#import中指定的模块进行区分。我不知道MQL4如何理解它。

简而言之,你不能在.mqh中定义一个函数的实现并在任何.ex5中毫无问题地使用它。

 
A100:
完全正确--只是C/C++理解这不是一个重新定义,而MQL5不理解。

C/C++只有在编译静态 库的时候才能理解这一点,因为源文件的名称信息被保存在对象文件中(正是为了识别重新编译)。

对于动态链接的库,这不会起作用,如果它起作用,也不是因为重新实现的检测,而是因为当前源码和DLL的命名一致性的 "优先规则"。 一些语言有这样的规则(特别是Delphi,可能一些C/C++编译器也有)。