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

 
これは正しいコンパイラの動作でしょうか?
class A
{
public:
  static int i;
  
  static int f()
  {
    A::i = 123;
    
    return(A::i);
  }
};

static int A::i = A::f();

void OnStart()
{
  Alert(A::i); // 123
}
A::iを呼び出すA::f()メソッドを呼び出したときに、A::iが生成されないようです。
 
fxsaber:
これは正しいコンパイラの動作でしょうか?A::iを呼び出すA::f()メソッドを呼び出した時点では、A::iは生成されていないようです。

クリエイテッドとはどういう意味ですか?

static は、グローバル変数や関数を隠すためのレーキを作成 し、関数やクラスの可視性を制限するだけです。

グローバル変数のメモリは常に存在します。
そして、そうです、グローバル変数の場合、初期化の順番は 非常に重要です(つまり、初期化される前に変数にアクセスするのは避けましょう)
この例はうまくいきました...

Документация по MQL5: Основы языка / Переменные / Создание и уничтожение объектов
Документация по MQL5: Основы языка / Переменные / Создание и уничтожение объектов
  • www.mql5.com
После загрузки на исполнение mql5-программы каждой переменной выделяется память в соответствие с типом переменной. Переменные делятся на два типа по уровню доступа - глобальные переменные и локальные переменные, и по классам памяти: входные параметры mql5-программы, статические и автоматические. Каждая переменная при необходимости...
 
Ilyas:

上の例ではうまくいきました...

このままコンパイラーを変更するのですか?個人的には、今のままでいいと思います。

 
fxsaber:

この時点でコンパイラを変更するのでしょうか?個人的には、すべてこのままでいいと思います。

行動を変えることは考えていません。

しかし、グローバル変数への アクセスエラー(初期化前)を検出する作業は後回しにされています。
この機能を実装すると、上記のコードをコンパイルする際に警告が表示されます。A::f()関数がA::iの初期化に使われており、初期化中のA::i変数にアクセスしているのです。

Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Глобальные переменные создаются путем размещения их объявлений вне описания какой-либо функции. Глобальные переменные определяются на том же уровне, что и функции, т. е. не локальны ни в каком блоке. Область видимости глобальных переменных - вся программа, глобальные переменные доступны из всех функций, определенных в программе...
 
Ilyas:

この機能を実装すると、上記のコードをコンパイルする際に警告が表示されます。A::f()関数がA::iの初期化に使われており、初期化中のA::i変数にアクセスしてしまうのです。

ありがとうございました。

 
Ilyas:

行動を変える予定はありません

そうすると、宣言が完了した時点で変数が宣言されたとみなすというあなたの概念と矛盾します。そもそも、なぜそれを発明したのですか?ある場合はそうで、別の場合は違うというのであれば

int i = i; //Error: 'i' - undeclared identifier
良い言語には統一されたルールがあり、その逆はない。
 
A100:

そうすると、宣言が完了した時点で変数が宣言されたとみなすというご自身の概念と矛盾します。そもそも、なぜそれを発明したのですか?ある場合はそうで、別の場合は違うということであれば

良い言語には統一されたルールがあり、その逆はない。

全く無知な私ですが、飲み過ぎたとしても(int i = i)とは思いませんでした.........。8(

 
Сергей Таболин:

まったく無知な私ですが、こんなこと(int i = i)は飲みすぎても思いつきませんでした・・・・・・。8(

また、元の例との 主な違いは何でしょうか?不要なものを取り除けば、必ず手に入る。

int i = i = 123; //Error: 'i' - undeclared identifier

ただ、そちらにはたくさんの弦があり、こちらには1本だけです。

もしコンパイルエラーがなければ、ここでもエラーにならないはずです(逆も然り)。

 
A100:

そうすると、宣言が完了した時点で変数が宣言されたとみなすというご自身の概念と矛盾します。そもそも、なぜそれを発明したのですか?ある場合はそうで、別の場合は違うということであれば

良い言語には統一されたルールがある、その逆はない
この場合はOKです。

ポイントは、他のもっとやっかいな条件でも未定義の動作になる可能性があるということです。C++でのセルフショットは実装可能です。
 
A100:

元の例と 根本的に違う点は何ですか?余計なものを取っ払えば、それでいい。

ただ、そこにはたくさんの線があり、ここにはひとつしかない。

コンパイルエラーがなければここでもないはずですが(逆も然り)、そうでなければ混乱します。

間違っている、同じじゃない。

クラス内の静的変数の記述は、その事前定義(関数やクラスの事前定義と同様)ですが、実際には、その変数がメモリ内のどこに格納され、いつ初期化されるべきかをコンパイラに指示するだけです。