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没有被编译到你的程序中。
答
它看起来像def.cpp没有在这里使用。正如你指出的那样,如果def.cpp被编译,它包含了def.h,并且如果这些函数是在def.h中定义的,那么这将是一个多重函数定义的警告或错误。
检查您的项目设置。
@Billy ONeal怎么可能.cpp没有被编译? – 2010-05-05 15:41:54
@Knowing:可以在项目属性中设置为Build:No,它可以不作为项目的一部分包含在内,它可以与项目中另一个.cpp文件具有完全相同的名称,这会导致编译后的输出被覆盖,或Visual Studio可能会感到困惑,并认为项目输出在不是时是最新的。可能还有其他一些事情可能会出错,但那些是我现在可以想到的。完全有可能使用'extern'赋予C链接功能,这也会导致链接器错误;因此我建议将其删除。 – 2010-05-05 15:49:28
我认为他的意思是“没有链接到”,可能还没有被编译。 – 2010-05-05 15:52:16