mql5 언어의 특징, 미묘함 및 작업 방법 - 페이지 151

 
fxsaber :

정적 변수는 첫 번째 호출에서 초기화됩니다.

개발자가 왜 이렇게 했는지 추측하기 어렵습니다. 제 생각에는 이것은 버그입니다. 컴파일 단계에서 알 수 없는 값으로 상수 변수를 초기화하는 것입니다.

나는 보통 무엇을 언제 초기화하는지 확인합니다.

 //+------------------------------------------------------------------+
void OnStart ()
{
   f( 333 );
   f( 2 );
}
//+------------------------------------------------------------------+
int init_static()
{
   Print ( __FUNCTION__ );
   return ( 1 );
}

void f( const int i )
{
   static const int j = init_static();
  
   Print ( __FUNCTION__ , " , j =" ,j);
}

2019.11.30 11:09:32.456 tst (EURUSD,H1) init_static

2019.11.30 11:09:32.457 tst (EURUSD,H1) f, j=1

2019.11.30 11:09:32.457 tst (EURUSD,H1) f, j=1


내 예에서는 모든 것이 올바르게 초기화되었으며 컴파일러는 앞으로 상수 j에 값을 제공하지 않습니다. 컴파일 오류가 발생합니다.

 
Vladimir Simakov :

공식 설명이 있을 때까지는 사용을 권하지 않고, 갑자기 가져가서 고칠 것입니다.

글쎄, 왜냐하면 어떤 경우에도 사용할 가치가 없기 때문입니다. 이것은 개념적 오류입니다.

 
Alexey Navoykov :

글쎄, 왜냐하면 어떤 경우에도 사용할 가치가 없기 때문입니다. 이것은 개념적 오류입니다.

왜 개념적인가? 반대로 컴파일 단계에서 정적 변수를 초기화하는 값이 무엇인지 모르는 경우가 있습니다. 여기서는 도움말을 처음 호출할 때 초기화만 하면 됩니다.

 
Alexey Navoykov :

글쎄, 왜냐하면 어떤 경우에도 사용할 가치가 없기 때문입니다. 이것은 개념적 오류입니다.

MVS C++17 구현:

정적 지역 변수

static 또는 thread_local 지정자를 사용하여 블록 범위에서 선언된 변수 (C++11 이후) 에는 정적 또는 스레드 (C++11 이후) 저장 기간이 있지만 제어가 선언을 처음 통과할 때 초기화됩니다(초기화가 0 또는 블록이 처음 입력되기 전에 수행할 수 있는 상수 초기화 ). 이후의 모든 호출에서는 선언을 건너뜁니다.

초기화 에서 예외가 발생 하면 변수는 초기화된 것으로 간주되지 않으며 다음에 제어가 선언을 통과할 때 초기화가 다시 시도됩니다.

초기화가 변수가 초기화되는 블록에 재귀적으로 들어가면 동작이 정의되지 않습니다.

여러 스레드가 동일한 정적 지역 변수를 동시에 초기화하려고 시도하면 초기화가 정확히 한 번 발생합니다( std::call_once 를 사용하여 임의의 함수에 대해 유사한 동작을 얻을 수 있음).

참고: 이 기능의 일반적인 구현은 이중 확인 잠금 패턴의 변형을 사용하여 이미 초기화된 로컬 정적에 대한 런타임 오버헤드를 단일 비원자 부울 비교로 줄입니다.

(C++11부터)

블록 범위 정적 변수의 소멸자 는 프로그램 종료 시 호출 되지만 초기화가 성공적으로 발생한 경우에만 호출됩니다.

동일한 인라인 함수 (암시적으로 인라인일 수 있음)의 모든 정의에 있는 함수 로컬 정적 개체는 모두 하나의 번역 단위에 정의된 동일한 개체를 참조합니다.

개인적으로 나는 그러한 구현이 mql에서 합법적인 경우에만 도크에 등록해야 합니다.

 
Vladimir Simakov :

왜 개념적인가? 반대로 컴파일 단계에서 정적 변수를 초기화하는 값이 무엇인지 모르는 경우가 있습니다. 여기서는 도움말을 처음 호출할 때 초기화만 하면 됩니다.

0(기본값) 값을 초기화해야 함을 의미합니다. 그리고 사용 가능한 첫 번째 값으로 초기화하는 이유는 무엇입니까? 그런 다음 함수의 동작이 이 함수에 대한 호출 순서에 따라 결정되어 부작용이 발생한다는 것이 밝혀졌습니다. 그리고 이것은 잘못된 것입니다. 내부를 외부에서 초기화하려면 함수가 아닌 클래스를 사용해야 합니다.

그러나 이것이 컴파일되지 않는다고 말한 것은 실제로 틀렸습니다. C++에서 이것은 이상하게도 작동하지만, 나는 이것을 할 생각을 한 적이 없습니다.

 
Alexey Navoykov : 이상하게도 C++에서 작동합니다. 하지만 이렇게 하는 것은 생각지도 못한 일입니다.

거기에는 항상 이런 식이었고 개념적 문제는 없었습니다. 그렇지 않으면 문제가 있을 것입니다.

 void fn() {
   static int i = fn_from_other_cpp();
}

그리고 파괴 순서는 엄격히 반대입니다.

 
Vict :

거기에는 항상 이런 식이었고 개념적 문제는 없었습니다. 그렇지 않으면 문제가 발생했을 것입니다.

귀하의 예는 다른 오페라의 약간입니다.
 
Slava :

"편집" 컨텍스트 메뉴를 선택한 후 내비게이터는 ex5와 동일한 경로에서 소스 mq5를 찾을 수 없습니다.

ex5가 mq5가 있는 Shared Projects의 scripts 폴더로 이동되었기 때문에

수정합시다. 테스터 설정 과 동일한 스마트 검색을 해보자

반대 상황도 있습니다. 즐겨찾기의 내비게이터에서 ex5가 누락된 경우(예: 컴파일 오류가 발생한 경우) mq5 편집(mq5 사용 가능)으로 전환할 수 없습니다. 이것도 고쳐주세요.

 
fxsaber :

반대 상황도 있습니다. 즐겨찾기의 내비게이터에서 ex5가 누락된 경우(예: 컴파일 오류가 발생한 경우) mq5 편집(mq5 사용 가능)으로 전환할 수 없습니다. 이것도 고쳐주세요.

2250이 짱입니다.

서둘러요. 2251 - mq5를 열지 않습니다.

 
fxsaber :

2250이 좋습니다.

서둘러요. 2251 - mq5를 열지 않습니다.

그는 존재합니까? 정말 있나요? 어떤 방법으로?

어떻게 번식할 수 있습니까?