2013-05-03 2 views

답변

2

대신 밖으로 코드를 최적화하기 위해 컴파일러에 의존, 당신은 당신이 코드를 실행하려는 경우에만 컴파일러에게 추가 심볼 정의를 전달할 수 cassert을 가져오고 assert(expensive_check())을 작성하십시오. 수표를 사용하지 않으려면 #define NDEBUG 앞에 넣고 cassert를 포함하십시오.

+0

글쎄, 더 좋은 방법이 있나요? 나는 이것을 제어하기 위해 어떤 깃발을 통과 할 수 있다는 것을 알고 있지만, 이것은 내가 원하는 것을 실제로는 아니다. – WhatABeautifulWorld

+2

@WhatABeautifulWorld와 "더 나은 방법"은 무엇이라고 생각 하는가? –

+1

@WhatABeautifulWorld 컴파일러가 마음을 읽을 것으로 기대합니까? 분명히 컴파일러에게 무엇을해야하는지 알려주고, 한 곳에서 (makefile) 그렇게하면 나에게 최적에 가깝게 보인다. – Voo

1

을 다른 기능으로 검사를 이동 :

3

상수 및 단일/if/def 쌍으로이 작업을 수행 할 수 있습니다. 이렇게하면 코드를 컴파일하고 오류를 검사 할 수 있지만 최적화 중에 생략 할 수 있습니다. 이렇게하면 검사 코드가 감지되지 않을 수있는 변경을 방지 할 수 있습니다.

#if defined(USE_EXPENSIVE_CHECKS) || defined(DEBUG) 
#define USE_EXPENSIVE_CHECKS_VALUE true 
#else 
#define USE_EXPENSIVE_CHECKS_VALUE false 
#endif 

namespace { 
const bool useExpensiveChecks = USE_EXPENSIVE_CHECKS_VALUE; 
}; 

void function() 
{ 
    if(useExpensiveChecks == true) 
    { 
     // expensive checks 
    } 
} 
2

전처리 기에서 매크로와 조건을 사용하면 실제로 컴파일러에서 코드가 생성되는 것을 피할 수있는 유일한 방법입니다.

그래서, 여기에 내가 그것을 할 것입니다 방법은 다음과 같습니다
#ifdef NEED_EXPENSIVE_CHECKS 
inline expensive_checking(params...) 
{ 
    ... do expensive checking here ... 
} 
#else 
inline expensive_checking(params...) 
{ 
} 
#endif 

은 그럼 그냥 전화 :

some code 
expensive_checking(some_parameters...) 
some other code 

빈 인라인 함수는 어떤 점잖은 현대 컴파일러 "아니오 코드"가 발생합니다. 디버그 빌드 설정에서 -DNEED_EXPENSIVE_CHECKS을 사용하고 릴리스 빌드에서 사용하지 마십시오.

나는 또한 이와 같은 매크로 기능의 조합을 사용하는 것으로 알려져 있습니다

: 이제

#ifdef NEED_EXPENSIVE_CHECKS 
#define EXPENSIVE_CHECKS(stuff...) expensive_checks(__FILE__, __LINE__, stuff...) 
inline expensive_checks(const char *file, int line, stuff ...) 
{ 
    if (some_checking) 
    { 
     cerr << "Error, some_checking failed at " << file << ":" << line << endl; 
    } 
} 
#else 
#define EXPENSIVE_CHECKS(stuff...) 
#endif 

을, 당신은 경우에 매우 유용 할 수있는 라인 무언가가 실패 할 때 어떤 파일에 대한 정보를 얻을 수 검사는 여러 위치에서 이루어집니다 (원하는 경우 함수명을 얻기 위해 __function__ 또는 __pretty_function__을 사용할 수 있습니다).

분명히 assert() 매크로는 파일 이름과 줄 번호를 제공하지 않는다는 점을 제외하면 내 매크로 솔루션의 기능을 수행합니다.

관련 문제