エラー、バグ、質問 - ページ 2520

 

そして、間違いはない

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

コンパイル時のエラー

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

それ以外は。

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

大丈夫です。何が違うの?

それに、C++は1パスで普通にコンパイルできる。

#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型 との誤植でしょうかね?

そうですね...わかりやすくするために、everywhereを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:

そうですね...わかりやすくするために、everywhereを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
}