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

 
이 주제와 관련이 없는 댓글은 " MQL5 MT5 MetaTrader 5 초보자의 질문 "으로 이동되었습니다.
 

일반 함수는 왼쪽에서 오른쪽으로 인수를 받습니다.

사용자 정의 - 오른쪽에서 왼쪽으로.

 double f1()
{
   Print ( __FUNCSIG__ );
  
   return ( 0 );
}

double f2()
{
   Print ( __FUNCSIG__ );
  
   return ( 0 );
}

void Func( double , double )
{
}

#define PRINT(A) Print ( #A); A

void OnStart ()
{  
  PRINT( MathMin (f1(), f2()));
  
  PRINT(Func(f1(), f2()));
}


결과.

         MathMin (f1(),f2())
         double f1()
         double f2()
        Func(f1(),f2())
         double f2()
         double f1()


그래서 의도?

 
fxsaber :

그래서 의도?

믿을 수 없는 UB입니다. 저것들. 프로그램의 논리가 인수 평가 순서에 따라 달라지는 상황을 명시적으로 피할 필요가 있습니다.

 
fxsaber :

일반 함수는 왼쪽에서 오른쪽으로 인수를 받습니다.

다음은 반대 예입니다.

 string f1() { Print ( 1 ); return NULL ; }
string f2() { Print ( 2 ); return NULL ; }
void OnStart ()
{
     StringCompare (f1(), f2());
}

결과: 2 1

 
Andrei Trukhanovich :

믿을 수 없는 UB입니다. 저것들. 프로그램의 논리가 인수 평가 순서에 따라 달라지는 상황을 명시적으로 피할 필요가 있습니다.

A100 :

다음은 반대 예입니다.

직원들과 모든 것이 불안정하다는 것이 밝혀졌습니다. 사용자 정의 - 확실히 처음부터.

 
fxsaber :

직원과 함께 모든 것이 불안정한 것으로 나타났습니다. 사용자와 함께 - 확실히 처음부터.

차이점은 일반 함수(오른쪽에서 왼쪽으로)와 인라인 함수(불확정 순서)가 있다는 것입니다.

인라인 함수는 전혀 함수가 아닙니다. 그들은 주소가 없습니다. 이러한 관점에서 보면 표준과 사용자 함수 사이에는 차이가 없습니다. 따라서 예를 들어 가장 단순한 사용자 함수(본질적으로 인라인임)가 항상 오른쪽에서 왼쪽으로 인수를 계산하는 이유는 명확하지 않습니다. 앞으로 인라인 함수의 순서가 변경될 수 있다는 점을 배제하지 않습니다. 따라서

계산 순서를 안전하게 사용하기 위해 인라인 키워드를 도입할 것을 제안한 적이 있습니다.

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

오류, 버그, 질문

A100 , 2017.10.05 14:30

이것은 다시 한 번 C ++ 인라인 키워드의 유용성을 증명합니다(여기에는 그것이 구식이라는 의견이 있었습니다).
무엇보다도 인라인은 실제로 프로그래머가 함수 매개변수의 평가 순서 사용을 거부한다는 것을 의미하며 컴파일러가 함수를 인라인으로 만들기로 결정하면 컴파일러는 직접 평가 순서를 더 효율적으로 사용할 수 있습니다(역순 평가는 호출된 함수에 대해서만 분명히 효과적입니다).
동시에 컴파일러가 인라인이 아닌 함수를 인라인으로 만들기로 결정하면 효율성 손실로 이어지는 경우에도 (일반) 역 평가 순서를 사용해야 합니다. 함수 인라인)

인라인은 평가 순서를 명시적으로 제어할 수 없는 MQL에서도 적합합니다.


 
A100 :

차이점은 일반 함수(오른쪽에서 왼쪽으로)와 인라인 함수(불확정 순서)가 있다는 것입니다.

인라인 함수는 전혀 함수가 아닙니다. 그들은 주소가 없습니다. 이러한 관점에서 보면 표준과 사용자 함수 사이에는 차이가 없습니다. 따라서 예를 들어 가장 단순한 사용자 함수(본질적으로 인라인임)가 항상 오른쪽에서 왼쪽으로 인수를 계산하는 이유는 명확하지 않습니다. 앞으로 인라인 함수의 순서가 변경될 수 있다는 점을 배제하지 않습니다. 따라서

계산 순서를 안전하게 사용하기 위해 인라인 키워드를 도입할 것을 제안한 적이 있습니다.

설명 감사합니다, 인라인에 대해 생각하지 않았습니다.

 __forceinline void Func( double , double )

이 옵션은 결과에 영향을 주지 않습니다.

 
fxsaber :

설명 감사합니다. 인라인 에 대해 생각하지 않았습니다.

이 옵션은 결과에 영향을 주지 않습니다.

이제 MQL에 없는 것 같기 때문에 영향을 미치지 않습니다.

 #define inline

미래에는 진정한 의미로 채워질 수 있습니다. 그렇지 않으면 왜 도입되겠습니까?

 
A100 :

이제 MQL에 없는 것 같기 때문에 영향을 미치지 않습니다.

미래에는 진정한 의미로 채워질 수 있습니다. 그렇지 않으면 왜 도입되겠습니까?

버전에 대한 도움말에서 내가 기억하는 한, *.h 파일이 인라인될 수 있도록 스텁으로 도입했습니다.

 
반환이 함수 인수로 전달되는 호출 함수의 순서에 관해서는 C++ 표준은 평가되는 순서대로 컴파일러에 요구 사항을 부과하지 않으며 임의의 순서로 호출할 수 있습니다( https://en.cppreference. com/w/cpp/language /eval_order ). 어느 정도까지 비유가 mql에 적용될 수 있습니까? 질문은 이미 개발자를 위한 것입니다. 그들은 결정할 수 있었거나 귀찮게 하지 않았을 수도 있습니다.