2013-09-24 3 views
7
내가 파일입니다 Simpletron.cpp

하는 Simpletron 클래스 선언하는 Simpletron.h를 호출 할 수 있습니다 :C 없음 구현 ++하지만 여전히

class Simpletron 
{  
public: 
    Simpletron(); 
}; 

내 MAIN.CPP에서 Simpletron() 전화 :

#include <iostream> 
#include "Simpletron.h" 

int main(int argc, char *argv[]) 
{ 

    Simpletron s(); 
    std::cin.get(); 
} 

주 기능은 경고 나 오류없이 원활하게 실행됩니다. 왜 그런가요? 헤더 파일이 링크 될 수있는 구현이 없다면 어떻게 컴파일합니까?

+4

@ Smac89 : 신고 할 때가 아닙니다. 어쩌면 나는 미쳐 가고 있을지 모르지만 적어도 7 명의 다른 사람들도 잘못되었습니다. 이 프로그램은 링커 오류를 발생시킵니다 (예 : http://ideone.com/5m0ygK). – GManNickG

+0

@octef : 실제 코드와 명령 줄을 제공해주십시오. 예를 들어, 클래스 정의 뒤에 세미콜론이 누락되어 컴파일 할 코드가 될 수 없습니다. – GManNickG

+0

예, 잠시만 기다려주세요. – octref

답변

24

이 줄 :

Simpletron s(); 

s라는 함수를 선언 Simpletron을 반환하고 인수를 복용하지, 함수 프로토 타입입니다. s이라는 Simpletron 인스턴스는 만들지 않습니다.

이제는 링커가 존재하지 않는 s() 함수에 대해 불평하지 않는지 물어볼 것입니다. 글쎄, 당신은 단지 s()을 선언하고 있기 때문에 실제로는 그것을 호출하지 않기 때문에 실제로 링크하는 동안 아무 곳에서나 참조되지 않으므로 링크 오류가 발생하지 않습니다.

13
Simpletron s(); 

이것은 객체 인스턴스화가 아닌 함수 선언입니다. 빈 괄호는 컴파일러에게이 함수가 인수를 취하지 않고 Simpletron 유형의 객체를 값으로 반환하므로 생성자가 호출되지 않습니다. 올바른 구문은 매개 변수없이 :

Simpletron s; // You will get an error on this line, as initially expected 

C++ (11)이 모호함 피하는 구문 기능 추가 :

Simpletron s{}; // same as default-initialization 
+0

"수정"은 링크 타임 오류를 발생시키는 것을 의미합니다. –

+0

문제가 해결되지 않습니다. 그것은 오류가 될 것입니다. – MahanGM

+4

@MahanGM : "수정"은 코드 _가 예상대로 작동 함을 의미합니다. –

5
Simpletron s(); 

이것은 "골치 아픈 구문 분석"의 고전적인 사례입니다; 컴파일러의 경우 Simpletron 유형의 변수 s을 만들지는 않지만 매개 변수를 사용하지 않고 Simpletron 객체를 반환하는 s이라는 함수를 선언하고 있습니다.

이것은이 표현식이 함수 선언과 변수 선언으로 해석 될 수 있다는 사실에서 비롯된 것입니다. 변수를 선언하기 위해서는이 것을 함수 선언으로 해석하는 표준 명령이 쉬운 대안 (즉, 괄호를 생략)이 있기 때문입니다.

이 문제없이 컴파일 단계를 통과 (컴파일러는 정의 모든 방법, 단지 선언을 할 필요가 없다), 및 Simpletron의 어떤 인스턴스가 없기 때문에 아마도 링커 오류를 제공하지 않습니다 실제로 생성자이므로 실제로 생성자 정의를 찾을 필요가 없습니다. (비록 내가 을 보장하지 않고이 오류를 제공하지 않는다면, 특히 철저한 컴파일러/링커 커플은 누락 된 생성자에 대한 오류를 줄 수 있어야합니다. 어쨌든).

관련 문제