即使在使用 extern 和 #ifdef 时也已在 .obj 中定义

Already defined in .obj even when using extern and #ifdef

我有三个这样的文件:

head.h

#ifndef HEAD_
#define HEAD_

extern int f();

#endif

mycpp.cpp

#include "head.h"

int f() {
    return 5;
}

myMain.cpp

#include <iostream>
#include "head.h"
#include "mycpp.cpp"

int main()
{
    std::cout << f() << std::endl;
    system("Pause");
    return 0;
}

运行 此代码产生 link 错误:

LNK2005 "int __cdecl f(void)" (?f@@YAHXZ) already defined in mycpp.obj

如果我将 inline 添加到 mycpp.cpp 中的函数 f,错误就会消失。

我的问题是如何在不使用 inline 函数的情况下摆脱这个错误?

P.S。这是作业,我只能修改 mycpp.cpp 文件。所以 #include "mycpp.cpp" 必须在那里。

我知道包含 cpp 文件不是个好主意,但我无法更改 myMain 文件。它是这样给出的。而且我不应该使用 inline.

一般规则是:从不 #include .cpp 文件。只应包含头文件。

此外,函数声明中的extern在这里是多余的。在 变量声明 上,extern 将语句标记为声明而不是定义。但是在函数声明上这不是必需的,而且函数无论如何都有外部链接。