2010-05-05 4 views
0

이 코드를 컴파일 할 수없는 이유는 무엇입니까?
오류 2 오류 LNK2019 : 확인되지 않은 외부 기호 "INT의 __cdecl f를 (구조체 X)"extern (al) 문제

오류 3 오류 LNK2019 : 확인되지 않은 외부 기호 "구조체 X __cdecl 연산자

//main 
    #include "stdafx.h" 
    #include "X.h" 
    #include "Y.h" 
    //#include "def.h" 

    extern X operator*(X, Y);//HERE ARE DECLARED EXTERNAL *(X,Y) AND f(X) 
    extern int f(X); 
    /*GLOBALS*/ 
    X x = 1; 
    Y y = x; 
    int i = 2; 

    int _tmain(int argc, _TCHAR* argv[]) 
    { 
     i + 10; 
     y + 10; 
     y + 10 * y; 
     //x + (y + i); 
     x * x + i; 
     f(7); 
     //f(y); 
     //y + y; 
     //106 + y; 
     return 0; 

    } 

//X 
struct X 
{ 
    int i; 
    X(int value):i(value) 
    { 
    } 
    X operator+(int value) 
    { 
     return X(i + value); 
    } 
    operator int() 
    { 
     return i; 
    } 
}; 
//Y 
struct Y 
{ 
    int i; 
    Y(X x):i(x.i) 
    { } 
    Y operator+(X x) 
    { 
     return Y(i + x.i); 
    } 
}; 

//def.h 
int f(X x); 
X operator*(X x, Y y); 
//def.cpp 
#include "stdafx.h" 
#include "def.h" 
#include "X.h" 
#include "Y.h" 


int f(X x) 
{ 
    return x; 
} 

X operator*(X x, Y y) 
{ 
    return x * y; 
} 

나는 오류 메시지를 받고 있어요 * (구조체 X, 구조체 Y) "

또 다른 흥미로운 점은 구현을 def.h 파일에 배치하면 오류없이 컴파일된다는 것입니다. 그렇다면 def.cpp는 어떨까요? 왜 함수 f (X)가 이미 정의되었다는 오류 메시지가 표시되지 않습니까? ODR 규칙을 적용해서는 안됩니다. 두 번째 관심사는 def.cpp에서 f의 반환 유형을 int에서 double로 변경하면 intelliSense가 오류로 밑줄을 긋지 만 프로그램이 여전히 컴파일된다는 것입니다. 왜?

답변

1

단어 extern 만 제거하면됩니다. 어쨌든 기본값입니다. 함수 선언을 의미하는 것은 아니며, C++에서는 어떠한 경우에도 피해야합니다. 여전히 문제가 있다면 def.cpp가 프로그램에 컴파일되지 않을 가능성이 있습니다.

+0

@Billy ONeal .cpp가 컴파일되지 않는 이유는 무엇입니까? –

+0

@ Knowing : 프로젝트 속성에서 빌드 : 아니요로 설정할 수 있습니다. 프로젝트의 일부로 포함 할 수 없으며 프로젝트의 다른 .cpp 파일과 동일한 이름을 가질 수 있습니다.이 파일은 프로젝트의 컴파일 된 출력을 덮어 쓰게하고, 또는 Visual Studio가 혼란스러워지고 그렇지 않을 때 프로젝트 출력이 최신이라고 생각할 수 있습니다. 잘못 될 수있는 다른 것들이있을 수 있지만, 지금 당장 생각할 수있는 것들이 있습니다. extern이 링커 에러를 일으키는 함수 C 링키지를 제공한다는 것은 전적으로 가능합니다. 그러므로 그것을 제거하는 나의 제안. –

+0

나는 그가 "연결되어 있지 않다"는 뜻으로, 컴파일되지 않았을 수도 있습니다. –

0

def.cpp가 여기에 사용되지 않는 것 같습니다. def.cpp가 컴파일되고 있다면 def.h를 포함하고 def.h에 함수가 정의되어 있다면 다중 함수 정의 경고 또는 오류가 될 것이라고 지적한다.

프로젝트 설정을 확인하십시오.