Ошибки, баги, вопросы - страница 2520

 

А никакой ошибки нет

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

Ошибка при компиляции

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

А так:

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

нормально. А какая разница?

Кроме того в С++ нормально компилируется и в один проход:

#ifdef __cplusplus
void f( int ) {}   //была функция
//...
void f( int = 1 ); //уточнили параметры по умолчанию
void OnStart()
{
        f();       //вызвали
}
#endif
 
А никакой ошибки при компиляции нет... осталось только угадать результат:
int f( int     ) { return 1; }
//...
int f( int = 2 );
int f( int     ) { return 3; }
void OnStart()
{
        Print( f( 0 ));
}
 

Непонятное предупреждение при компиляции

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

А так:

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

все нормально - нет никаких предупреждений. А какая разница?

 
A100:

Непонятное предупреждение при компиляции

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

//lib.mq5 //реализация
void f() {}
С типом int опечатка, я полагаю?
 
Alexey Navoykov:
С типом int опечатка, я полагаю?

Да... исправил везде на void - для простоты. 

С другой стороны так тоже смысл, но уже предупреждения (*) не ясен

//lib.h //объявления
int g();  //Warning: no #import declaration //(*)
void f(); //Warning: no #import declaration
lib.h - общий файл с объявлениями, а lib.mq5, lib2.mq5, lib3.mq5... файлы с реализациями, которые подключаются посредством #include по необходимости. Таким образом реализации int g() в конкретной сборке может и не быть вообще, а непонятное предупреждение - есть. Фактически их там сотни - и они мешают увидеть действительно важные предупреждения
 
A100:

Да... исправил везде на void - для простоты. 

С другой стороны так тоже смысл, но уже предупреждения (*) не ясен

lib.h - общий файл с объявлениями, а lib.mq5, lib2.mq5, lib3.mq5... файлы с реализациями, которые подключаются посредством #include по необходимости. Таким образом реализации int g() в конкретной сборке может и не быть вообще, а непонятное предупреждение - есть. Фактически их там сотни - и они мешают увидеть действительно важные предупреждения

Да, неприятно.  Причём даже если в том же инклюднике прописать реализацию, то предупреждение тоже вылазит.

 

Отдельное внимания заслуживает следующая ошибка:

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

По сути похожа на эту, но при наличии множества файлов довольно неочевидная и труднопостижимая

 
Подскажите, как в C++  с этим?
struct A
{
  int i;
};

struct B : public A
{
  string Str;
};

void OnStart()
{
  A a = {0};
  B b;
  
  b = a; 
  a = b; // OK
}
Задумался, использовать эту фишку в своем коде или нет. Если в C++ работает, буду использовать. Нет - вряд ли, т.к. могут отменить в следующих билдах.
 
Это ошибка, что отсутствует предупреждение об инициализации?
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
}
Причина обращения: