2017-03-15 5 views
3

문자열 convertion는

/path/to/MyTest.cpp:8: Failure: 
    CHECK(x == y) 
with expansion: 
    1 == 2 

/path/to/MyTest.cpp:9: Failure: 
    CHECK(eq(x, y)) 
with expansion: 
    false 

이유에 문자열에 xy 변환 잡을 수 있습니다 연산자 표현식은 x == y이지만 함수 호출 식 eq(x, y)에 없습니까? 다음과 같은 출력을 얻을 수있는 유사한 방법으로 함수 호출 식을 캐릭터 라인 화 어떻게 든 가능 :

/path/to/MyTest.cpp:9: Failure: 
    CHECK(eq(x, y)) 
with expansion: 
    eq(1, 2) 

답변

1

재미있는 부분은 this :

#define INTERNAL_CATCH_TEST(expr, resultDisposition, macroName) \ 
    do { \ 
     Catch::ResultBuilder __catchResult(macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition); \ 
     try { \ 
      CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ 
      (__catchResult <= expr).endExpression(); \ 
      CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \ 
     } \ 
     catch(...) { \ 
      __catchResult.useActiveException(resultDisposition); \ 
     } \ 
     INTERNAL_CATCH_REACT(__catchResult) \ 
    } while(Catch::isTrue(false && static_cast<bool>(!!(expr)))) // expr here is never evaluated at runtime but it forces the compiler to give it a look 
    // The double negation silences MSVC's C4800 warning, the static_cast forces short-circuit evaluation if the type has overloaded &&. 

여기서 exprx == y 또는 eq(x, y)입니다.
__catchResult <= expr 결과를 (__catchResult <= x) == y에 해당 __catchResult <= x == y 인해 ==에 비해 <=의 낮은 우선 순위 (C++ operator precedence 참조) : 그것은x == y작동 방식

. __catchResult <= x== 연산자를 사용하여 y이 전달 된 객체에 x을 래핑합니다. 그것이 expr이 파괴 된 방법입니다. 나머지는 상상하기 쉽습니다.

는 왜eq(x, y)작동하지 않습니다 : __catchResult <= eq(x, y)eq(x, y)에서

__catchResult <= expr 결과는 첫 번째 (더 destructuring)을 평가하지 않습니다.

식이 괄호로 묶인 경우에도 같은 이유로 작동하지 않습니다. 예를 들어, (x == y)__catchResult <= (x == y)이되며이 경우 먼저 x == y이 평가됩니다 (소멸되지 않음). 그렇기 때문에 CHECK((x == y));은 출력을 발생시킵니다.

/path/to/MyTest.cpp:8: Failure: 
    CHECK((x == y)) 
with expansion: 
    false 
2

내가 CHECK이 그냥 표현이 함수 호출의 결과를보고 eq(x, y)을보고 한 번 생각한다.

당신은 당신의 CHECK 전에 INFO이 함수 호출에 매개 변수를 볼 수 삽입 할 수 있습니다 다음 CHECK 전화에 기록됩니다

INFO("x:" << x << ", y:" << y); 
CHECK(eq(x, y)); 

("메시지와 함께"표시) :

CHECK(eq(x, y)) 
with expansion: 
    false 
with message: 
    x:1, y:2