外部)问题

时间:2010-05-05 15:26:58

标签: c++ extern

为什么我不能编译这段代码?

   //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;
}

我的错误信息:
错误2错误LNK2019:未解析的外部符号“int __cdecl f(struct X)”

错误3错误LNK2019:未解析的外部符号“struct X __cdecl operator *(struct X,struct Y)”

另一个有趣的事情是,如果我将实现放在def.h文件中,它确实编译没有错误。那么def.cpp怎么样?为什么我没有得到错误信息已经定义了函数f(X)?这里不应该应用ODR规则。我所关心的第二个问题是,如果在def.cpp中我将f的返回类型从int更改为double intelliSense,则将此作为错误强调但程序仍然编译?为什么呢?

2 个答案:

答案 0 :(得分:1)

只需删除extern一词即可。无论如何它都是默认值 - 它对函数声明没有任何意义,在任何情况下都应该避免使用C ++。如果你仍然遇到问题,可能def.cpp没有被编译到你的程序中。

答案 1 :(得分:0)

看起来这里没有使用def.cpp。正如您所指出的,如果正在编译def.cpp,它将包含def.h,如果函数是在def.h中定义的,那么这将是一个多函数定义警告或错误。

检查项目设置。