static 또는 thread_local 지정자를 사용하여 블록 범위에서 선언된 변수 (C++11 이후) 에는 정적 또는 스레드(C++11 이후) 저장 기간이 있지만 제어가 선언을 처음 통과할 때 초기화됩니다(초기화가 0 또는 블록이 처음 입력되기 전에 수행할 수 있는 상수 초기화 ). 이후의 모든 호출에서는 선언을 건너뜁니다.
초기화 에서 예외가 발생 하면 변수는 초기화된 것으로 간주되지 않으며 다음에 제어가 선언을 통과할 때 초기화가 다시 시도됩니다.
초기화가 변수가 초기화되는 블록에 재귀적으로 들어가면 동작이 정의되지 않습니다.
여러 스레드가 동일한 정적 지역 변수를 동시에 초기화하려고 시도하면 초기화가 정확히 한 번 발생합니다( std::call_once 를 사용하여 임의의 함수에 대해 유사한 동작을 얻을 수 있음).
참고: 이 기능의 일반적인 구현은 이중 확인 잠금 패턴의 변형을 사용하여 이미 초기화된 로컬 정적에 대한 런타임 오버헤드를 단일 비원자 부울 비교로 줄입니다.
(C++11부터)
블록 범위 정적 변수의 소멸자 는 프로그램 종료 시 호출 되지만 초기화가 성공적으로 발생한 경우에만 호출됩니다.
동일한 인라인 함수 (암시적으로 인라인일 수 있음)의 모든 정의에 있는 함수 로컬 정적 개체는 모두 하나의 번역 단위에 정의된 동일한 개체를 참조합니다.
왜 개념적인가? 반대로 컴파일 단계에서 정적 변수를 초기화하는 값이 무엇인지 모르는 경우가 있습니다. 여기서는 도움말을 처음 호출할 때 초기화만 하면 됩니다.
0(기본값) 값을 초기화해야 함을 의미합니다. 그리고 사용 가능한 첫 번째 값으로 초기화하는 이유는 무엇입니까? 그런 다음 함수의 동작이 이 함수에 대한 호출 순서에 따라 결정되어 부작용이 발생한다는 것이 밝혀졌습니다. 그리고 이것은 잘못된 것입니다. 내부를 외부에서 초기화하려면 함수가 아닌 클래스를 사용해야 합니다.
그러나 이것이 컴파일되지 않는다고 말한 것은 실제로 틀렸습니다. C++에서 이것은 이상하게도 작동하지만, 나는 이것을 할 생각을 한 적이 없습니다.
정적 변수는 첫 번째 호출에서 초기화됩니다.
개발자가 왜 이렇게 했는지 추측하기 어렵습니다. 제 생각에는 이것은 버그입니다. 컴파일 단계에서 알 수 없는 값으로 상수 변수를 초기화하는 것입니다.
나는 보통 무엇을 언제 초기화하는지 확인합니다.
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에 값을 제공하지 않습니다. 컴파일 오류가 발생합니다.
공식 설명이 있을 때까지는 사용을 권하지 않고, 갑자기 가져가서 고칠 것입니다.
글쎄, 왜냐하면 어떤 경우에도 사용할 가치가 없기 때문입니다. 이것은 개념적 오류입니다.
글쎄, 왜냐하면 어떤 경우에도 사용할 가치가 없기 때문입니다. 이것은 개념적 오류입니다.
왜 개념적인가? 반대로 컴파일 단계에서 정적 변수를 초기화하는 값이 무엇인지 모르는 경우가 있습니다. 여기서는 도움말을 처음 호출할 때 초기화만 하면 됩니다.
글쎄, 왜냐하면 어떤 경우에도 사용할 가치가 없기 때문입니다. 이것은 개념적 오류입니다.
MVS C++17 구현:
정적 지역 변수
static 또는 thread_local 지정자를 사용하여 블록 범위에서 선언된 변수 (C++11 이후) 에는 정적 또는 스레드 (C++11 이후) 저장 기간이 있지만 제어가 선언을 처음 통과할 때 초기화됩니다(초기화가 0 또는 블록이 처음 입력되기 전에 수행할 수 있는 상수 초기화 ). 이후의 모든 호출에서는 선언을 건너뜁니다.
초기화 에서 예외가 발생 하면 변수는 초기화된 것으로 간주되지 않으며 다음에 제어가 선언을 통과할 때 초기화가 다시 시도됩니다.
초기화가 변수가 초기화되는 블록에 재귀적으로 들어가면 동작이 정의되지 않습니다.
여러 스레드가 동일한 정적 지역 변수를 동시에 초기화하려고 시도하면 초기화가 정확히 한 번 발생합니다( std::call_once 를 사용하여 임의의 함수에 대해 유사한 동작을 얻을 수 있음).
참고: 이 기능의 일반적인 구현은 이중 확인 잠금 패턴의 변형을 사용하여 이미 초기화된 로컬 정적에 대한 런타임 오버헤드를 단일 비원자 부울 비교로 줄입니다.
블록 범위 정적 변수의 소멸자 는 프로그램 종료 시 호출 되지만 초기화가 성공적으로 발생한 경우에만 호출됩니다.
동일한 인라인 함수 (암시적으로 인라인일 수 있음)의 모든 정의에 있는 함수 로컬 정적 개체는 모두 하나의 번역 단위에 정의된 동일한 개체를 참조합니다.
개인적으로 나는 그러한 구현이 mql에서 합법적인 경우에만 도크에 등록해야 합니다.
왜 개념적인가? 반대로 컴파일 단계에서 정적 변수를 초기화하는 값이 무엇인지 모르는 경우가 있습니다. 여기서는 도움말을 처음 호출할 때 초기화만 하면 됩니다.
0(기본값) 값을 초기화해야 함을 의미합니다. 그리고 사용 가능한 첫 번째 값으로 초기화하는 이유는 무엇입니까? 그런 다음 함수의 동작이 이 함수에 대한 호출 순서에 따라 결정되어 부작용이 발생한다는 것이 밝혀졌습니다. 그리고 이것은 잘못된 것입니다. 내부를 외부에서 초기화하려면 함수가 아닌 클래스를 사용해야 합니다.
그러나 이것이 컴파일되지 않는다고 말한 것은 실제로 틀렸습니다. C++에서 이것은 이상하게도 작동하지만, 나는 이것을 할 생각을 한 적이 없습니다.
거기에는 항상 이런 식이었고 개념적 문제는 없었습니다. 그렇지 않으면 문제가 있을 것입니다.
그리고 파괴 순서는 엄격히 반대입니다.
거기에는 항상 이런 식이었고 개념적 문제는 없었습니다. 그렇지 않으면 문제가 발생했을 것입니다.
"편집" 컨텍스트 메뉴를 선택한 후 내비게이터는 ex5와 동일한 경로에서 소스 mq5를 찾을 수 없습니다.
ex5가 mq5가 있는 Shared Projects의 scripts 폴더로 이동되었기 때문에
수정합시다. 테스터 설정 과 동일한 스마트 검색을 해보자
반대 상황도 있습니다. 즐겨찾기의 내비게이터에서 ex5가 누락된 경우(예: 컴파일 오류가 발생한 경우) mq5 편집(mq5 사용 가능)으로 전환할 수 없습니다. 이것도 고쳐주세요.
반대 상황도 있습니다. 즐겨찾기의 내비게이터에서 ex5가 누락된 경우(예: 컴파일 오류가 발생한 경우) mq5 편집(mq5 사용 가능)으로 전환할 수 없습니다. 이것도 고쳐주세요.
2250이 짱입니다.
서둘러요. 2251 - mq5를 열지 않습니다.
2250이 좋습니다.
서둘러요. 2251 - mq5를 열지 않습니다.
그는 존재합니까? 정말 있나요? 어떤 방법으로?
어떻게 번식할 수 있습니까?