0

このコードをコンパイルできないのはなぜですか?

   //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)"

もう1つの興味深い点は、実装をdef.hファイルに配置すると、エラーなしでコンパイルされることです。しかし、def.cppはどうですか?関数f(X)がすでに定義されているというエラーメッセージが表示されないのはなぜですか?ここでは、ODRルールを適用しないでください。私が抱えている2番目の懸念は、def.cppでfの戻り型をintからdouble intelliSenseに変更した場合、これはエラーとして強調されますが、プログラムはまだコンパイルされますか?なんで?

4

2 に答える 2

1

単語を削除するだけexternです。とにかくこれはデフォルトです-関数宣言には何の意味もありません。C++ではどのような場合でも避ける必要があります。それでも問題が解決しない場合は、def.cppがプログラムにコンパイルされていない可能性があります。

于 2010-05-05T15:32:54.070 に答える
0

ここではdef.cppが使用されていないようです。ご指摘のとおり、def.cppがコンパイルされている場合は、def.hが含まれ、関数がdef.hで定義されている場合は、複数の関数定義の警告またはエラーになります。

プロジェクトの設定を確認してください。

于 2010-05-05T15:56:05.190 に答える