2012-03-29 2 views
3

저는 학생이며, 테스트를 시작하기 전에 테스트 코드를 작성하고 테스트 코드를 작성하여 테스트하려고합니다. 지금 시도하려는 것은 테스트 중입니다. 코드는 값 의미를 제대로 방지합니다. 내 과제에서 각 클래스에 대해 자신의 개인 복사 생성자와 할당 연산자가 정의되어 있지 않으므로 아무것도 선언하지 않았습니다. 테스트 프로그램에서 호출 될 때 예상했던 컴파일 오류가 발생합니다. 이런 식으로 뭔가 :컴파일 오류에 대한 C++ 테스트

error: 'myClass::myClass(const &myClass)' is private'

error: 'myClass& myClass::operator=(const myClass&)' is private

내 테스트 코드를 컴파일하고 실행하지만, 이러한 오류가 발생했다는 것을 나에게 보여 있도록 시도/캐치를 사용하는 방법이 있나요? 나는 시도했다 :

myClass obj1(...); 
myClass obj2(...); 
try{ 
    obj1 = obj2; 
    throw 1; 
} 
catch(int e){ 
    assert(e==1); 
} 

하지만 컴파일러는 여전히 나에게 위의 오류를주고있다. 이것들은 '예외'가 아닌가? 그들이 던지지 않을 것인가?

try/catch를 올바르게 이해하고 있다면 런타임 오류를 처리하고 위에 오류가 발생하지 않은 오류를 처리합니다.

더 많은 조사를 한 후에 C++ 내에서 네이티브하게 특정 컴파일 오류를 테스트하는 방법이 없다고 생각됩니다 (대부분의 언어에서이 사실을 생각할 수 있습니다). 나는 post을 읽었는데, C++ 코드 스 니펫을 컴파일하고 오류를 검사하는 스크립팅 언어로 테스트 코드를 작성하고, 또 다른 post은 Boost.Build를 사용하도록 권장합니다.

내가하려는 일을하는 가장 쉽고/좋은 방법은 무엇입니까?

나는 Boost.Build에 관한 문서를 살펴 봤는데 내 머리 위로 조금있다. 만약 내가 그것을 사용하면 어떻게 파일을 테스트 할 것이라고, 'test.cpp'컴파일, 그리고 아마도 'test.cpp'와 발생하는 특정 컴파일 오류를 처리 할 수 ​​있습니까?

도움 주셔서 감사합니다.

P. 이것은 나의 첫 번째 게시물 중 하나이며, "충분한"연구를 수행하고 다른 모든 작업을 올바르게 완료했기를 바랍니다. 미안해.

+0

은 즉시 당신이 당신의 프로그램을 컴파일, 당신은 오류의 목록을 얻을. 충분하지 않았습니까?! 테스트 클래스를 추가하면 코드에서 더 많은 "컴파일 오류"를 추출 할 수 없습니다. 테스트 클래스는 (컴파일 후) 코드를 실행하고 의미 론적 오류를 추출합니다. – Shahbaz

+0

필자가 테스트하고 싶은 소수의 연산만을 가지고있는이 경우, 컴파일 오류를 읽는 것은 큰 문제가 아니 었습니다. 하지만 큰 프로젝트를 수행하면서 많은 작업/행동을 방지하고 컴파일 오류를 생성하려는 작업/동작이있을 때 어떤 일이 발생합니까? 수동으로 읽고 각각을 확인하는 것은 약간 지루한 것 같습니다. –

+0

잠깐, 런타임 작업/동작에 "컴파일 오류가 발생할 수 없습니다". 컴파일러는 코드를 읽고, C++ 언어를 어휘 적으로, 어휘 적으로, 의미 론적으로 따르고 코드를 생성합니다. C++ 언어에 의해 지정된 것만 검사합니다. 생성 된 코드가 작동하지 않으면 컴파일러와 관련이 없습니다 (따라서 컴파일 오류를 줄 수는 없습니다) – Shahbaz

답변

3

이들은 컴파일러 오류이며 예외는 아닙니다. 예외는 프로그래머가 런타임 오류를 발생시키고 캐치/처리하는 메커니즘입니다. 컴파일러는 코드가 잘못된 형식이며 잘못된 C++ 코드임을 인식하기 때문에 실행할 수있는 실행 파일을 빌드하지 못합니다.

런타임 오류가 발생하도록하려면 메서드 public/use friends /를 사용하여 무언가에 대한 액세스를 제공하고 메서드의 정의에서 예외를 throw하고 예외를 catch하고 처리합니다. 호출 코드.

그러나 이렇게하는 데는 목적이 없습니다. 항상 런타임 오류에 대한 컴파일 타임 오류를 선호합니다. 항상.

C++ 표준은 유효하지 않은 코드 또는 정의되지 않은 코드를 정의하고 일부는 정의되지 않은 상태로 남겨두고 다른 것들은 컴파일러를 구현 한 사람에게 맡깁니다. 모든 표준 호환 C++ 컴파일러는 무언가가 표준/정의를 만족하지 않으므로 오류를 발생시킬 수 있습니다. 오류는 일반적으로 무언가가 모호하거나 똑바로 무의미하다고 말하면서 작성한 내용을 수정해야합니다.

런타임 오류는 사용자의 관점에서 의도하지 않은 원치 않는 동작 또는 충돌입니다. 컴파일러 오류는 컴파일러는 "당신이 말하는 것을 이해하지 못합니다. 컴파일러 경고는 컴파일러가 "당신이이 일을하도록 내버려 두 겠지만 아마 그렇게해서는 안됩니다. 정말로 이것이 당신이 의미하는 바가 틀림 없습니까?"라고 말하는 컴파일러입니다.

+2

+1 :'런타임 오류에 대해 컴파일시 오류가 항상 선호 됨 ' –

3

try-catch는 런타임에 발생하지만 컴파일러는 정적으로 컴파일 할 때 호출하는 함수를 연결하려고하므로 컴파일이 항상 실패합니다.

또는 C++ 예외를 사용하려는 경우 복사 및 할당 방법을 구현하고 공용으로 설정 한 다음 해당 기능 본문에 예외를 throw하면됩니다. 기본적으로 모든 상황에서 선택이 있다면 런타임 검사보다 정적/컴파일 타임 검사를 선호해야합니다.

+0

감사의 말 Preet, 나는 이것을했고, 예외를 조금 더 이해하는 것을 도왔다. 이제는 컴파일 타임 검사가 훨씬 더 바람직하다는 것을 알았습니다. –

0

이러한 종류의 컴파일 오류는 해결할 수 없습니다. 그것들은 C++ standart의 관점에서 볼 때 오류입니다.

확실히 자신의 (또는 패치 된) 컴파일러에서 일부를 억제 할 수 있습니다.

1

실제로 테스트하고 싶은 것은 컴파일러가 실패하지 않았지만 클래스에 대한 특정 가정을 테스트하려고합니다. 테스트 파일에서

#include <type_traits>을 넣고 여기에 설명되어 있습니다 확인할 수 있습니다

assert((std::is_assignable <myClass, myClass> ::value) == FALSE); 
assert((std::is_copy_assignable<myClass> ::value) == FALSE); 
assert((std::is_copy_constructible<myClass> ::value) == FALSE); 

다양한 특성을 추가 http://en.cppreference.com/w/cpp/types

공지 사항, 당신은 컴파일해야합니다을 C++ 11에서 대부분의 함수를 사용합니다.

(Assert that code does NOT compile 먼저 설명은)

+0

assert 대신 static_assert를 사용하면 컴파일 오류가 발생합니다. – Tomis

관련 문제