mql5中的OOP、模板和宏,细微之处和用途 - 页 24

 
Vict:

所以它将发挥作用,我想。

不是这样的

#import正在期待一个文件名

胜利

只是不明白--蜡烛是为了什么而燃烧?

我不想在dll中做连接管理器,在MT4中,由于某些原因,如果我从2个EA中调用2次dll,那么新的dll副本不会在内存中创建(dll有静态对象,在.Net上有包装 - 如果我运行一个dll,那么它就会崩溃,2个不同的文件没有问题)。

所以我想快速地--只要把mylib.dll文件复制到mylib02.dll上,一切都可以顺利进行....。但想在全局范围内声明一个宏置换

 
Igor Makanu:
它不是这样工作的

而这看起来是一个错误/失败。请注意最后一个帖子中的PS

PS:如果你还是很想,试试name_dll(不带点),也许它能起飞。

 
Vict:

而这看起来是一个错误/失败。请注意上一篇文章中的PS

MT4的情况不是这样的

MT4只有在运行时才会看到dll本身,而我和你讨论的是--它不被编译器本身所允许,也就是说,编译器会这样通过

#import "mylib.dll"
#import
#import "mylib"
#import

而如果你这样写的话。

#import 
"mylib.dll"   //'mylib.dll' - expressions are not allowed on a global scope
#import

也就是说,有一个严格的语法指令#import+一些带引号的字符串--而且都是在一行。

但我不知道为什么我不能用我的组合通过宏替换来替换#import "mylib.dll"。

胜利

PS:如果你还是很想,试着给name_dll(不带点),也许会有效果。

我不明白为什么我甚至不能用条件编译来构建inludes?- 一切都在MQL中非常原始地运作 ....虽然我希望我只是不理解它
 
Igor Makanu:

MT4的情况不是这样的

MT4只有在运行时才会看到dll本身,而我和你讨论的是--编译器不会让它通过,也就是说,编译器是这样通过的

而如果你这样写的话。

也就是说,有一个严格的语法指令#import+一些带引号的字符串--而且都是在一行。

但谁知道为什么我不能用宏来代替#import "mylib.dll "的组合?

我不明白为什么我甚至不能用条件编译来构建inludes?- 一切都在MQL中非常原始地运作 ....虽然我希望我只是不理解它

我不知道为什么它对你不起作用,它对我起作用。

#define  DD "jkjk.dll"
#import  DD
void fn();
#import
现在只要在不同的EA中设置不同的DD("lib_1.dll"、"lib_2.dll")。
 
Vict:

我不知道为什么它对你不起作用,它对我很有效。

现在只要在不同的EA中设置不同的DD("lib_1.dll"、"lib_2.dll")。

对不起,忘记了--我的源码是通过slang预处理器,在µl中传递的--是的,它不起作用。

 
Vict:

对不起,我忘了--我的源代码是通过slang预处理程序,以µl的形式传递的--是的,不工作。

一般来说,我已经采取了MQL,所以它将按计划工作。

#ifdef  USE_DLL_NUMBER
   #ifdef  USE_DLL_NUMBER02 
      #import "mylib2.dll"
   #endif 
#else 
#import "mylib.dll"   
#endif

我在主代码中声明了2个宏置换

#define  USE_DLL_NUMBER

#define  USE_DLL_NUMBER02 

...将它减少到一个宏 USE_DLL_NUMBER02 - 一般来说是类似于适合我的东西 - 我希望将来有需要时能写出 USE_DLL_NUMBER03 , USE_DLL_NUMBER04 -。

 
Igor Makanu:

...把它缩减为一个单一的宏 USE_DLL_NUMBER02 - 一般来说是类似于适合我的东西 - 我希望能够写出 USE_DLL_NUMBER03 , USE_DLL_NUMBER04 - 在未来如果需要的话。

一般来说,在蛮力的帮助下,有可能解决这个问题

#ifdef  USE_DLL_NUMBER01 
#define  USE_DLL_NUMBER 
#endif
#ifdef  USE_DLL_NUMBER02  
#define  USE_DLL_NUMBER 
#endif
#ifdef  USE_DLL_NUMBER03 
#define  USE_DLL_NUMBER 
#endif
#ifdef  USE_DLL_NUMBER04 
#define  USE_DLL_NUMBER 
#endif
#ifdef  USE_DLL_NUMBER05 
#define  USE_DLL_NUMBER 
#endif
 

为什么mql4不实现一个#if宏,按值工作,你可以创建选择性的对象,如

#define  Znah 0
#define  PrmI int    Peremen=6;
#define  PrmD double Peremen=3.345;

#if  Znah//если больше 0 то появится переменная int Peremen
   PrmI
#else
    PrmD//иначе появится переменная double Peremen
#endif
因此,整个后续程序可以用正确的类型进行纠正。
 
我从未遇到过返回错误的表达式。
ORDER_TIME_DONE_MSC == DEAL_TIME_MSC

这就是为什么很难根据交易历史对订单执行时间进行统计。

如果我们还能为市场订单匹配ORDER_TIME_SETUP_MSC 的值,那么它对订单来说就没有意义了。

 
这很可能是一个过时的东西。const修饰符并不保证对象不会被改变。
struct A
{
  int i;

  void f( const A &Value )  
  {
    Print(Value.i); // 0
    
    this.i = Value.i + 1;
    
    Print(Value.i); // 1
  }
};

void OnStart()
{
  A a;
  
  a.f(a);
}


有些编译器在这种情况下可能会发出警告。

原因: