La diferencia entre externo y de entrada - página 3

 
//+------------------------------------------------------------------+
//|                                                          inc.mqh |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"

extern int x;

int z(){
   x=122;
   return x;

Expet:

//+------------------------------------------------------------------+
//|                                                          exp.mq5 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

int x=1;

#include <inc.mqh>

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Alert(x);
   Alert(z());   
   Alert(x);   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
 
Dmitry Fedoseev:

Duck, tienes una biblioteca. Por supuesto, habrá diferentes variables. Lo que se pretende es conectar mqh a través de include.

En C++, los externos sólo se describen en las bibliotecas de inclusión, de lo contrario el compilador no le permitirá compilar el proyecto


Dmitry Fedoseev:

externo:

el includer se insertará en el cuerpo del programa cuando lo compile. si quiere describir una instancia allí, ocurrirá lo mismo.


alternativamente, podrías describir una clase o estructura externa con el modificador ;)

 
Igor Makanu:

En C++, los externos se describen en las bibliotecas de inclusión, de lo contrario el compilador no le permitirá compilar el proyecto.

La forma habitual de llamar a una biblioteca es utilizar "#include" como nombre del archivo

 
Igor Makanu:

...

El punto de esto es que el includer se insertará en el cuerpo del programa al compilar, si quieres describir una instancia allí, lo mismo sucederá.

El objetivo es permitir que el archivo enlazable se maneje independientemente de todo el proyecto, para compilarlo por separado y así comprobar si hay errores.

 
Dmitry Fedoseev:

El objetivo es poder trabajar en un archivo de complemento independientemente de todo el proyecto, para compilarlo por separado y así comprobar si hay errores.

Creo que estamos buscando el punto en el que simplemente no existe.

el externo se mantuvo por compatibilidad con miles de códigos escritos anteriormente y la ayuda fue escrita por un tipo que copió parte de la información de la wiki.

 
Igor Makanu:

Creo que buscamos un significado donde no lo hay.

imho, extern se mantuvo para la compatibilidad de miles de códigos escritos anteriormente, y la ayuda fue escrita por una persona que copió parte de la información de wiki

¿Cuál es el veredicto, señores?) Si escribo un programa .mq5 con .mqh (#include), puedo escribir con seguridad extern y no temer consecuencias inesperadas (como hice en mql4) o usar input ?
 
Maksim Neimerik:
Entonces, ¿cuál es el veredicto de los Señores)? Si escribo un programa .mq5 con .mqh (#include), puedo escribir con seguridad extern y no temer consecuencias inesperadas (como hice en mql4) o usar input ?

Depende de los fines. Tienen propósitos diferentes.

 
Maksim Neimerik:
¿Cuál es el veredicto señores)? Si escribo un programa .mq5 con .mqh (#include), ¿puedo escribir extern con seguridad y no temer consecuencias inesperadas (como hice en mql4) o debo seguir usando input?

Utiliza las construcciones estándar de los programas MQL: toda la entrada al principio del código, luego todo el include. Así es como están escritos los ejemplos y el 99% del código en codobase, y no te llevarás ninguna sorpresa.

Una vez más acerca de extern - se pueden cambiar durante la ejecución del programa, pero en mi opinión es una mala práctica, por lo general todas las variables externas en OnInit () se copian en sus variables y luego trabajar con ellos (como un ejemplo de expertos que trabajan para 4 caracteres y 5 caracteres - ejemplos de este diseño en la red toneladas)


Y la línea de fondo - no utilice extern, si usted modifica el código antiguo, sustituirlo por el de entrada y el compilador le ayudará con advertencias si había un registro en extern - usted debe arreglarlo

 

Por cierto, he descubierto que al compilador no le importa que pueda volver a declarar el contenido del enum como una variable

enum mode5
{
   Manual         = 0,// Standard in Pips
   Kijun_sen      = 1 // Stoploss +/- Kijun-sen
};

//а потом где угодно можно объявить и компилятору будет пофиг

string Kijun_sen ="Да мне вообще пофиг что ты там объявил";      
 
Aleksey Semenov:

Por cierto, he descubierto que al compilador no le importa que pueda volver a declarar el contenido del enum como una variable

¿qué pasa si declaro una variable enum?

enum mode5
{
   Manual         = 0,// Standard in Pips
   Kijun_sen      = 1 // Stoploss +/- Kijun-sen
};


string Kijun_sen ="Да мне вообще пофиг что ты там объявил"; 

void OnStart()
  {
      mode5 x = Kijun_sen;
   
  }
//+------------------------------------------------------------------+

conversión enum implícita tst1.mq5 24 17


también puede comprobar EnumToString()


Creo que el tipo sin variables declaradas fue simplemente expulsado de la compilación como no utilizado