2010-11-26 1 views
1

내가 좋아하는 뭔가가있는 경우 : 나는 또한 주장하는 것과 동일한 통화를 사용하고, 그래서 별도의 FNC이 FNC 몸 밖으로 이동하고자하는 어설 션을 호출하는 함수를 호출 할 때 프로그램의 릴리스 버전에서 제거됩니까?

static long double calcFactor_(const short mantissa, const short exponent,const short base = Derived::internals_.base_) 
     { 
      assert(mantissa > 0); 
      assert(mantissa < NumericLimits<short>::max); 
      assert(exponent < NumericLimits<short>::max); 
      assert(exponent > NumericLimits<short>::min); 
      assert(base < NumericLimits<short>::max); 
      assert(base > NumericLimits<short>::min); 
      return mantissa * ::pow(static_cast<long double>(base),exponent); 
     } 

내 프로그램의 다른 곳에서

및 지금 자산에 대한 호출이있는 곳에서이 fnc로만 호출하십시오. 하지만 내가 틀렸다면 정정 해줘 : 버전 릴리스에서 제거 될 예정 주장하는 사람들 호출하지만이있는 경우 :

void Assert (//neccesary args here) 
{ 
assert(mantissa > 0); 
       assert(mantissa < NumericLimits<short>::max); 
       assert(exponent < NumericLimits<short>::max); 
       assert(exponent > NumericLimits<short>::min); 
       assert(base < NumericLimits<short>::max); 
       assert(base > NumericLimits<short>::min); 
} 

또한 버전 릴리스에서 제거 여부 될이 FNC에 호출? 그리고 또 다른 Q 저는 최종 버전에서 제거 될 것이라는 주장이 있기 때문에 이익이되는 것이므로 if (! 조건) 체크를해야한다고 생각합니다. 어떻게 생각해?

+0

NDEBUG가 정의되면 어설 션이 제거됩니다. 단언 문 안에 부작용이있는 명령문을 제거하는 것은 좋지 않기 때문에 절대로 수행하지 않는 것이 좋습니다. –

+2

이 어설트들은 꽤 쓸모가 없다는 점에 유의하십시오. 'NumericLimits :: max' –

+0

@Let_Me_Be 당신은 절대적으로 옳습니다. –

답변

1

예, assert은 출시 빌드에는 적용되지 않지만 Assert 함수는 계속 호출됩니다. 기껏해야 컴파일러가 빈 함수를 감지하고 호출을 억제 할 수는 있지만 그다지 중요하지 않습니다. 이 실제로 인 경우 릴리스 빌드에서 이러한 호출을 제거하려는 경우 일부 #ifdef/#endif으로이 호출을 둘러 쌀 수 있습니다.

어설트의 장점에 관해서는 분명히 "주관적이고 논쟁적인"것이므로 나는 지나칠 것이다!

1

오류 검사는 항상 어설 션과 결합해야합니다. 그렇지 않으면 모든 안정 코드가 사라질 것이므로 릴리스 모드에서는 아무 것도 얻지 못합니다. 그래서 제가 당신이라면, 당신의 기능에 잘못되거나 부적합한 데이터를 보호하기 위해 if 문을 넣을 것입니다.

컴파일러에 의해 "비어있는"기능이 제거되는지 또는 릴리스 빌드에서 제거되는지 여부는 컴파일러에 따라 다릅니다. 그러나 나는 입력 데이터가 유효한지 아닌지를 결정하는 유일한 메커니즘으로 주장을 남기지 않을 것이다. 나는 그것을 막기 위해 if 문을 사용한다. 그러므로 그것은 일종의 논점이됩니다.

+0

어설 션은 "안정성 코드"가 아닙니다. 어설 션은 디버거가 이러한 주석이 실제로 정확한지를 확인한다는 점을 제외하고는 주석 형식입니다. 그 외에도 다른 주석과 마찬가지로 적절한 프로그램 흐름과 관련이 없습니다. – MSalters

0

당신의 컴파일러가 빈 함수 호출을 최적화하면 달라질 것입니다. (모든 사람들이 사라지게 될 것입니다.)

관련 문제