2012-02-09 3 views
10

메서드를 선언하지만 구현하지 않은 클래스가 있습니다. 이 메서드는 가상 함수가 아닙니다. 해당하는 cpp 파일에서 같은 메소드의 정의를 찾지 못했습니다. 클래스에서 선언 된 다른 모든 메소드가 정의되었습니다.클래스에서 선언되었지만 정의되지 않은 메서드

코드를 컴파일 했으므로 잘되었습니다. 나는 cpp가 선언 된 메소드의 정의를 강제해야한다는 인상을 받았다.

누군가가 똑같이 정교하게 해석 할 수 있다면 좋겠다. VS2010에서 cl 컴파일러를 사용하고 있습니다.

답변

10

코드가 컴파일되지만 연결 오류가 발생합니다. 컴파일러는 단지 언어의 의미를 확인하여 오브젝트 코드로 소스 코드를 변환

컴파일 동안 연결

  • 컴파일
  • : 프로젝트의 실행 파일을 구축

    두 단계를 포함한다 .
    링크하는 중 링커는 실제로 심볼의 정의를 찾고 컴파일 중 생성 된 여러 객체 파일에서 실행 파일을 만듭니다.

    컴파일러는 각 변환 단위 (.cpp + 헤더 파일)의 소스 코드를 개별적으로 컴파일하므로 정의가 다른 소스 파일에 있어야한다고 가정합니다. 링커가 함수 정의에 대한 참조를 찾으려고하므로 링커가 누락 된 정의를보고합니다. 링커가 이 프로그램에 의해을 사용들만 문자, 예를 들어
    를 연결하는 데 필요한

    참고 : 프로그램이 함수를 선언하는 경우,/더 정의 & 다음 결코 용도를 제공하지 않습니다 어디 함수를 호출, 링커는 모든 함수 호출 사이트에서 함수의 목적 코드가 상주하는 주소로 점프하기위한 코드를 임베드 할 필요가 없습니다.
    그런 시나리오가 주어지면 링커는 함수 정의를 전혀 찾지 않아도됩니다. 따라서 코드가 컴파일되고 링크됩니다.

+5

IMHO, 연결 오류는 정의가없는 함수가 명시 적으로/암시 적으로 어딘가에서 사용/호출되고있는 경우에만 발생합니다. – fizzbuzz

+0

@fizzbuzz : 예, 물론입니다. 이것이 기본 기준입니다. –

+0

컴파일이나 링크 오류가 발생하지 않습니다. 추가하기 만하면 어디서나 funtion을 사용하지 않습니다. 코드가 컴파일되어 .lib 파일로 잘 링크됩니다. – akrohit

3

특정 파일에 구현할 메소드가 필요하지 않습니다. 실제로 라이브러리와 링크 할 때 부풀어 오름을 줄이기 위해 메소드 당 하나의 파일을 갖는 것이 좋은 프로그래밍 실습으로 간주됩니다.

이것은 클래스를 정의하는 헤더 파일 (주어진 구현에 포함되지 않은 것으로 가정)을 사용하면 컴파일러는 모든 함수가 어딘가에 구현되었다고 가정 할 수 있습니다. 시스템이 모든 것을 하나로 모으려고 할 때 (링크 단계)에만 거기에없는 것을 언급한다는 것이 명백합니다.

+0

** 방법 당 하나의 파일 **? 과도한 것 같습니다 ... –

+0

. 훨씬 덜 부 풀리고 놀라운 링크 문제를 만듭니다. 일부 최신 컴파일러는 각 함수를 별도의 객체 섹션에 살게하여 불필요하게 만들지 만 대부분은 그렇지 않습니다. –

+0

두 번 확인했는데 다른 파일에서도 위의 내용을 설명하는 메서드 정의를 찾을 수 없습니다. – akrohit

3

할당이나 복사를 방지하는 일반적인 방법입니다. 선언했지만 정의하지 않으면 실수로 사용하는 사람을 막는 경우 연결 오류가 발생합니다.

0

구문/컴파일러 오류가 없으므로 컴파일러에서 불평하지 않습니다. 링커는 프로그램에서 함수를 호출하지 않으므로 불필요하므로 링크 할 필요가 없습니다.

관련 문제