Der Unterschied zwischen extern und input - Seite 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, du hast eine Bibliothek. Natürlich wird es unterschiedliche Variablen geben. Gemeint ist die Anbindung von mqh über include.

In C++ werden Externs nur in Include-Bibliotheken beschrieben, sonst lässt der Compiler Sie das Projekt nicht kompilieren


Dmitry Fedoseev:

extern:

der Includer wird beim Kompilieren in den Programmkörper eingefügt. Wenn Sie dort eine Instanz beschreiben wollen, geschieht dasselbe.


alternativ könnte man auch eine externe Klasse oder Struktur mit dem Modifikator beschreiben ;)

 
Igor Makanu:

In C++ werden Externs in Include-Bibliotheken beschrieben, andernfalls lässt der Compiler Sie das Projekt nicht kompilieren.

Der übliche Weg, eine Bibliothek aufzurufen, ist die Verwendung von "#include" als Name der Datei

 
Igor Makanu:

...

Der Sinn dabei ist, dass der Includer beim Kompilieren in den Körper des Programms eingefügt wird, wenn man dort eine Instanz beschreiben will, passiert das Gleiche.

Es geht darum, die verknüpfbare Datei unabhängig vom Gesamtprojekt zu behandeln, sie separat zu kompilieren und so auf Fehler zu prüfen.

 
Dmitry Fedoseev:

Es geht darum, eine Plugin-Datei unabhängig vom Gesamtprojekt bearbeiten zu können, sie separat zu kompilieren und dabei auf Fehler zu prüfen.

Ich glaube, wir suchen nach dem Punkt, an dem er einfach nicht mehr da ist.

Das Extern wurde aus Gründen der Kompatibilität mit Tausenden von zuvor geschriebenem Code beibehalten, und die Hilfe wurde von einem Mann geschrieben, der einige der Informationen aus dem Wiki kopiert hat.

 
Igor Makanu:

Ich glaube, wir suchen nach einem Sinn, wo keiner ist.

imho, extern wurde für die Kompatibilität von Tausenden von Codes, die früher geschrieben wurden, beibehalten, und die Hilfe wurde von einer Person geschrieben, die einige der Informationen aus Wiki kopiert hat

Wie lautet das Urteil, meine Herren?) Wenn ich ein .mq5-Programm mit .mqh (#include) schreibe, kann ich sicher extern schreiben und muss keine Angst vor unerwarteten Konsequenzen haben (wie ich es in mql4 getan habe) oder input ?
 
Maksim Neimerik:
Wie lautet also das Urteil der Herren?) Wenn ich ein .mq5-Programm mit .mqh (#include) schreibe, kann ich sicher extern schreiben und muss keine Angst vor unerwarteten Konsequenzen haben (wie ich es in mql4 getan habe) oder input ?

Es kommt darauf an, welchen Zweck man verfolgt. Sie haben unterschiedliche Zwecke.

 
Maksim Neimerik:
Wie lautet also das Urteil, meine Herren?) Wenn ich ein .mq5-Programm mit .mqh (#include) schreibe, kann ich dann gefahrlos extern schreiben und muss keine Angst vor unerwarteten Konsequenzen haben (wie ich es in mql4 getan habe), oder sollte ich trotzdem input verwenden?

Verwenden Sie die Standard-MQL-Code-Konstrukte: alle Eingaben am Anfang des Codes, dann alle Includes. So sind die Beispiele der Entwickler geschrieben, und 99% des Codes in der Codobase sind so geschrieben, und Sie werden keine Überraschungen erleben.

Noch einmal zu extern - sie können während der Ausführung des Programms geändert werden, aber meiner Meinung nach ist es schlechte Praxis, in der Regel alle externen Variablen in OnInit () sind in ihre Variablen kopiert und dann mit ihnen arbeiten (als Beispiel die Experten, die für eine 4-stellige und 5-stellige arbeiten - Beispiele für dieses Design im Netzwerk Tonnen)


Und die Quintessenz - verwenden Sie nicht extern, wenn Sie alten Code ändern, ersetzen Sie es mit Eingabe und der Compiler wird Ihnen helfen, mit Warnungen, wenn es einen Datensatz in extern - Sie müssen es beheben

 

Übrigens habe ich festgestellt, dass es dem Compiler egal ist, dass ich den Inhalt der Aufzählung als Variable neu deklarieren kann

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

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

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

Übrigens habe ich herausgefunden, dass es dem Compiler egal ist, dass ich den Inhalt der Aufzählung als Variable neu deklarieren kann

Was passiert, wenn ich eine Enum-Variable deklariere?

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


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

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

implizite enum-Umwandlung tst1.mq5 24 17


Sie können auch EnumToString() prüfen


Ich denke, der Typ ohne deklarierte Variablen wurde bei der Kompilierung einfach als nicht verwendet verworfen.