질문에 언어 태그가 없지만 "커피 언어"에 대해 암묵적으로 이야기하고 있음을 알고 있습니다. 그러나 완전성을 위해 C ++ 세계에서 다소 다른 명백한 합의를 언급하고 싶습니다.
C ++ 프로그래머가 일반적으로 관심을 가질만한 세 가지 사항이 있습니다.
- 최적화 된 빌드에서 오버 헤드가 없습니까? (즉,“컴파일”할 수 있습니까?)
- 오류가 감지 된 시점에서이를 사용하여 디버거에 트랩 할 수 있습니까?
- 선언 된 함수의 문제를보고하는 데 사용할 수 있습니까
noexcept
?
과거에는 다음과 같은 코드를 작성하여 첫 번째 문제에 접근했습니다.
int
factorial(const int n)
{
if (CHECK_ARGS)
{
if (n < 0)
throw std::invalid_argument {"n < 0"};
}
int fac = 1;
for (int i = 2; i <= n; ++i)
fac *= i;
return fac;
}
여기서 CHECK_ARGS
된다 #define
컴파일러 완전히 모든 인수 검사 코드를 제거 할 수 있도록 컴파일 시간 상수 거라고 최적화 만든다. (체크 아웃을 컴파일하는 것이 일반적으로 좋은 것이라고 말하지는 않지만 사용자 에게 옵션이 있어야한다고 생각합니다. 컴파일 할 수 이 .)
인수 확인 코드가 명확하게 함께 그룹화되어 표시되는이 솔루션에 대해 여전히 맘에 듭니다 if
. 그러나 두 번째 및 세 번째 문제는 이것으로 해결되지 않습니다. 따라서 assert
인수 확인을 위해 매크로를 사용하는 데 더 집중 하고 있습니다.
코딩 표준 부스트는 이 동의 :
프로그래머 오류는 어떻습니까?
개발자로서 내가 사용하는 라이브러리의 전제 조건을 위반 한 경우 스택 풀기를 원하지 않습니다. 내가 원하는 것은 코어 덤프 또는 동등한 것입니다. 문제가 감지 된 정확한 시점에서 프로그램의 상태를 검사하는 방법입니다. 그것은 보통 그 assert()
와 같은 것을 의미 합니다.
에서 존 Lakos에 의해 주어진 매우 흥미로운 이야기가 있었다 CppCon'14는 제목의 오른쪽을 완료 방어 프로그래밍 ( 1 부 , 2 부 ). 대화의 첫 부분에서 그는 계약 이론과 정의되지 않은 행동에 대해 논의합니다. 두 번째 부분에서, 그는 체계적인 인수 확인을위한 아주 좋은 제안을 제시합니다. 본질적으로, 그는 사용자가 인수 확인을 위해 라이브러리에 기부 할 예산의 양 (CPU 사용률 측면에서)을 선택할 수있는 어설 션 매크로를 제안하고 라이브러리가 해당 예산을 현명하게 사용하도록합니다. 또한, 사용자는 계약이 깨졌을 때 호출되는 전역 오류 처리 기능을 설치할 수도 있습니다.
함수가 개인이라는 측면에 관해서는 이것이 인수를 확인 해서는 안된다는 것을 의미하지는 않습니다 . 내부 함수의 계약을 위반하지 않기 위해 자체 코드를 더 신뢰할 수도 있지만 완벽하지 않다는 것도 알고 있습니다. 내부 함수의 인수 검사는 클라이언트 코드에서 버그를 감지하는 공용 함수에서와 마찬가지로 자체 버그를 감지하는 데 도움이됩니다.