【问题标题】:extern(al) problem外部(人)问题
【发布时间】:2010-05-05 23:56:05
【问题描述】:

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

   //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 会强调这是一个错误,但程序仍然可以编译?为什么?

【问题讨论】:

    标签: c++ extern


    【解决方案1】:

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

    【讨论】:

    • @Billy ONeal .cpp 怎么可能没有被编译?
    • @Knowing: 可以设置为 Build: No 在项目属性中,它可能不包含在项目中,它可能与项目中的另一个 .cpp 文件具有完全相同的名称,这会导致编译的输出被覆盖,或者 Visual Studio 可能会感到困惑,并认为项目输出是最新的,而实际上它不是。可能还有其他一些可能出错的事情,但这些是我现在能想到的。完全有可能使用extern给了函数C链接,这也会导致链接器错误;因此我建议删除它。
    • 我认为他的意思是“未链接到”,可能也没有被编译。
    • @Billy 即使我已将其删除,我也会遇到同样的错误。那么我可以在两个不同的文件中同时拥有这两个定义并且我没有收到错误消息这一事实呢?
    • 我重新启动了 VS 并且原始版本正常工作。难以置信。项目中没有任何改变。设置。
    【解决方案2】:

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

    检查您的项目设置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-02
      • 2017-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多