Errores, fallos, preguntas - página 2520

 

Y no hay error

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

Error durante la compilación

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

Por lo demás:

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

Está bien. ¿Cuál es la diferencia?

Además, C++ compila normalmente en una sola pasada:

#ifdef __cplusplus
void f( int ) {}   //была функция
//...
void f( int = 1 ); //уточнили параметры по умолчанию
void OnStart()
{
        f();       //вызвали
}
#endif
 
Y no hay ningún error de compilación... Sólo queda adivinar el resultado:
int f( int     ) { return 1; }
//...
int f( int = 2 );
int f( int     ) { return 3; }
void OnStart()
{
        Print( f( 0 ));
}
 

Advertencia poco clara sobre la compilación

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

Por lo demás:

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

todo está bien - no hay advertencia. ¿Qué diferencia hay?

 
A100:

Aviso poco claro durante la compilación

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

//lib.mq5 //реализация
void f() {}
Una errata con el tipo int, supongo.
 
Alexey Navoykov:
Es un error de imprenta con el tipo de int, supongo.

Sí... Corregido en todas partes para anular - para simplificar.

Por otro lado, el significado, pero ya las advertencias (*) no están claras

//lib.h //объявления
int g();  //Warning: no #import declaration //(*)
void f(); //Warning: no #import declaration
lib.h es un archivo de declaración general, mientras que lib.mq5, lib2.mq5, lib3.mq5... con implementaciones, que se incluyen mediante #include según sea necesario. Por lo tanto, puede que no haya ninguna implementación de int g() en una compilación particular, pero la oscura advertencia está ahí. De hecho, hay cientos de ellas y le impiden ver las advertencias realmente importantes
 
A100:

Sí... Corregido en todas partes para anular - para simplificar.

Por otro lado, el significado, pero ya las advertencias (*) no están claras

lib.h es un archivo común con declaraciones, mientras que lib.mq5, lib2.mq5, lib3.mq5... con implementaciones, que se introducen a través de #include según sea necesario. Por lo tanto, puede que no haya ninguna implementación de int g() en una compilación particular, pero la oscura advertencia está ahí. En realidad, hay cientos de ellas, y obstaculizan la visión de los avisos realmente importantes.

Tenga en cuenta que incluso si especifica una implementación en el mismo libro de inclusión, esta advertencia también aparecerá.

 

El siguiente error merece especial atención:

//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();
}

Esencialmente similar a este, pero con muchos archivos, bastante poco evidentes y difíciles de entender

 
¿Puede decirme cómo funciona C++ con esto?
struct A
{
  int i;
};

struct B : public A
{
  string Str;
};

void OnStart()
{
  A a = {0};
  B b;
  
  b = a; 
  a = b; // OK
}
Me pregunto si debo utilizar esta función en mi código o no. Si funciona en C++, lo utilizaré. No, no lo creo, porque puede ser cancelado en las próximas construcciones.
 
¿Es un error que no haya un aviso de inicialización?
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
}