Fehler, Irrtümer, Fragen - Seite 2520

 

Und es gibt keinen Fehler

Это_новая_форма_комментария;
void OnStart() {}
 

Fehler bei der Kompilierung

void f() {} //Error: 'f' - function must have a body
void f();
void OnStart()
{
        f();
}

Ansonsten:

void f() {}
void OnStart()
{
        f();
}

Das ist in Ordnung. Was ist der Unterschied?

Außerdem wird C++ normalerweise in einem Durchgang kompiliert:

#ifdef __cplusplus
void f( int ) {}   //была функция
//...
void f( int = 1 ); //уточнили параметры по умолчанию
void OnStart()
{
        f();       //вызвали
}
#endif
 
Und es gibt keinen Kompilierungsfehler... Es bleibt nur noch, das Ergebnis zu erraten:
int f( int     ) { return 1; }
//...
int f( int = 2 );
int f( int     ) { return 3; }
void OnStart()
{
        Print( f( 0 ));
}
 

Unklare Warnung bei der Zusammenstellung

//lib.mqh //объявления
void f(); //Warning: no #import declaration
//lib.mq5 //реализация
void f() {}
//Test1.mq5 //собираем все вместе
#include "lib.mqh"
#include "lib.mq5"
void OnStart() { f(); }

Ansonsten:

//Test2.mq5
void f();
void f() {}
void OnStart() { f(); }

Alles ist in Ordnung - es gibt keine Warnung. Welchen Unterschied macht das?

 
A100:

Unklare Warnung während der Kompilierung

//lib.mqh //объявления
int f(); //Warning: no #import declaration

//lib.mq5 //реализация
void f() {}
Ein Tippfehler bei der Angabe von int, nehme ich an?
 
Alexey Navoykov:
Ich nehme an, es handelt sich um einen Druckfehler beim Typ int?

Ja... Der Einfachheit halber überall auf "void" korrigiert.

Andererseits sind die Bedeutung, aber auch bereits die Warnungen (*) nicht klar

//lib.h //объявления
int g();  //Warning: no #import declaration //(*)
void f(); //Warning: no #import declaration
lib.h ist eine allgemeine Deklarationsdatei, während lib.mq5, lib2.mq5, lib3.mq5... Dateien mit Implementierungen, die bei Bedarf mittels #include eingebunden werden. So kann es sein, dass es in einem bestimmten Build überhaupt keine int g()-Implementierung gibt, aber die obskure Warnung ist da. Tatsächlich gibt es Hunderte von ihnen, und sie verhindern, dass Sie wirklich wichtige Warnungen sehen
 
A100:

Ja... Der Einfachheit halber überall auf "void" korrigiert.

Andererseits sind die Bedeutung, aber auch bereits die Warnungen (*) nicht klar

lib.h ist eine allgemeine Datei mit Deklarationen, während lib.mq5, lib2.mq5, lib3.mq5... Dateien mit Implementierungen, die bei Bedarf über #include eingefügt werden. So kann es sein, dass es in einem bestimmten Build überhaupt keine int g()-Implementierung gibt, aber die obskure Warnung ist da. Tatsächlich gibt es Hunderte von ihnen, und sie behindern die Sicht auf wirklich wichtige Warnungen.

Beachten Sie, dass diese Warnung auch dann erscheint, wenn Sie eine Implementierung in demselben Einbeziehungsbuch schreiben.

 

Der folgende Fehler verdient besondere Aufmerksamkeit:

//lib1.mqh
void f(); //Error: 'f' - function must have a body
#include "lib.mq5"
//...
//lib2.mqh
void f();
#include "lib.mq5"
//...
//lib.mq5
void f() {}
#include "lib1.mqh"
#include "lib2.mqh"
void OnStart()
{
        f();
}

Im Wesentlichen ähnlich wie diese, aber mit vielen Dateien, eher unübersichtlich und schwer zu verstehen

 
Können Sie mir sagen, wie C++ dabei vorgeht?
struct A
{
  int i;
};

struct B : public A
{
  string Str;
};

void OnStart()
{
  A a = {0};
  B b;
  
  b = a; 
  a = b; // OK
}
Ich frage mich, ob ich diese Funktion in meinem Code verwenden soll oder nicht. Wenn es in C++ funktioniert, werde ich es verwenden. Nein, das glaube ich nicht, denn es könnte in den nächsten Builds gestrichen werden.
 
Ist es ein Fehler, dass es keine Initialisierungswarnung gibt?
struct A
{
  int i;
};

struct B : public A
{
  string Str;
};

void OnStart()
{
  A a;
  B b;
  
//  b = a; // possible use of uninitialized variable 'a'
  a = b; // OK
}