爲什麼我無法編譯此代碼?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,智能感知將此作爲錯誤強調,但程序仍編譯?爲什麼?
@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