extern(al)问题

问题描述:

为什么我无法编译此代码?extern(al)问题

//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(结构X)”

错误3错误LNK2019:解析外部符号“结构X __cdecl操作者*(struct X,struct Y)“

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

只要删除单词extern。无论如何它是默认的 - 它不代表函数声明的任何内容,并且在任何情况下都应该避免使用C++。如果你仍然有问题,可能def.cpp没有被编译到你的程序中。

+0

@Billy ONeal怎么可能.cpp没有被编译? – 2010-05-05 15:41:54

+0

@Knowing:可以在项目属性中设置为Build:No,它可以不作为项目的一部分包含在内,它可以与项目中另一个.cpp文件具有完全相同的名称,这会导致编译后的输出被覆盖,或Visual Studio可能会感到困惑,并认为项目输出在不是时是最新的。可能还有其他一些事情可能会出错,但那些是我现在可以想到的。完全有可能使用'extern'赋予C链接功能,这也会导致链接器错误;因此我建议将其删除。 – 2010-05-05 15:49:28

+0

我认为他的意思是“没有链接到”,可能还没有被编译。 – 2010-05-05 15:52:16

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

检查您的项目设置。