Errori, bug, domande - pagina 2860

 
È un comportamento corretto del compilatore?
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
}
Sembra che A::i non venga creato quando viene chiamato il metodo A::f(), che chiama A::i.
 
fxsaber:
È un comportamento corretto del compilatore? Sembra che A::i non venga creato al momento della chiamata del metodo A::f() che chiama A::i.

Cosa si intende per "creato"?

static è solo un modo per creare un rake per nascondere una variabile globale o una funzione, limitando la visibilità di una funzione o di una classe

La memoria di una variabile globale esiste sempre.
E sì, per le variabili globali l'ordine di inizializzazione è molto importante (voglio dire, evitare di accedere alla variabile prima che sia inizializzata)
Questo esempio ha funzionato...

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

Nell'esempio precedente ha funzionato...

Hai intenzione di cambiare il compilatore a questo punto? Personalmente, mi piacerebbe tenerlo così com'è.

 
fxsaber:

Cambierete il compilatore a questo punto? Personalmente, vorrei mantenere tutto com'è.

Non abbiamo intenzione di cambiare il comportamento.

Ma c'è un compito differito di rilevare gli errori di accesso alle variabili globali (prima dell'inizializzazione).
Se implementiamo questa funzione, otterremo un avvertimento durante la compilazione del codice precedente: la funzione A::f() è usata per inizializzare A::i, che fornisce l'accesso alla variabile A::i che viene inizializzata.

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

Se implementiamo la funzione, otterrete un messaggio di avvertimento durante la compilazione del codice precedente: la funzione A::f() è usata per inizializzare A::i, che accede alla variabile A::i che viene inizializzata.

Grazie!

 
Ilyas:

Non abbiamo intenzione di cambiare il comportamento

Allora contraddice il tuo concetto che una variabile è considerata dichiarata quando la dichiarazione è completa. Perché l'hai inventato? Se è così in un caso e diverso in un altro caso

int i = i; //Error: 'i' - undeclared identifier
Una buona lingua ha regole uniformi, non il contrario
 
A100:

Allora contraddice il tuo stesso concetto che una variabile è considerata dichiarata quando la dichiarazione è completa. Perché l'hai inventato? Se è così in un caso e diverso in un altro

Una buona lingua ha regole uniformi, non il contrario

Sono un ignorante totale, ma non ci avrei pensato (int i = i) nemmeno se avessi bevuto troppo....... 8(

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

Sono un ignorante totale, ma non avrei pensato a questo (int i = i) nemmeno se avessi bevuto troppo....... 8(

E qual è la principale differenza rispetto all'esempio originale? Togliete le cose inutili e lo otterrete:

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

Solo che ci sono molte corde lì, e solo una qui.

Se non c'è un errore di compilazione non dovrebbe essercene uno anche qui (e viceversa), altrimenti è un casino

 
A100:

Allora contraddice il tuo stesso concetto che una variabile è considerata dichiarata quando la dichiarazione è completa. Perché l'hai inventato? Se è così in un caso e diverso in un altro

Una buona lingua ha regole uniformi, non il contrario
In questo caso va bene.

Il punto è che si può ottenere un comportamento indefinito in altre condizioni più complicate. Gli autoscatti in C++ sono implementabili.
 
A100:

Qual è la differenza fondamentale rispetto all'esempio originale? Togli la roba extra e ce l'hai:

Solo che ci sono molte corde lì, e solo una qui

Se non c'è un errore di compilazione non dovrebbe essercene uno anche qui (e viceversa), altrimenti è un casino.

Ti sbagli, non è la stessa cosa.

La descrizione di una variabile statica in una classe è la sua pre-definizione (simile alla pre-definizione di una funzione o di una classe), ma la posizione, in effetti, dice solo al compilatore dove la variabile sarà memorizzata in memoria e quando dovrebbe essere inizializzata