包括.cpp文件

20 浏览
0 Comments

包括.cpp文件

我在类似这里看到,在C++中,你必须包含.h文件而不是.cpp文件,否则会出现错误。所以举个例子,如果我用#include \"foop.h\"替换#include \"foop.cpp\",就会出现错误(在使用Dev C++ 4.9.9.2和Windows的情况下):multiple definition of foo(int) first defined here。为什么会这样呢?

0
0 Comments

当你使用#include "foop.cpp"时,就相当于你把整个foop.cpp的内容复制粘贴到了main.cpp中。

所以当你编译main.cpp时,编译器会生成一个main.obj,其中包含了两个函数mainfoo的可执行代码。

而当你单独编译foop.cpp时,编译器会生成一个foop.obj,其中包含了函数foo的可执行代码。

当将它们链接在一起时,编译器会发现函数foo有两个定义(一个来自main.obj,另一个来自foop.obj),并且会报错提示你有多个定义。

这个问题的出现原因是,使用#include指令将一个.cpp文件包含到另一个.cpp文件中时,会导致重复定义的问题。

解决方法是,不要使用#include指令将.cpp文件包含到另一个.cpp文件中。而是将共享的代码定义为函数或类,并将其放在单独的头文件(.h)中。然后在需要使用这些代码的地方,使用#include指令将头文件包含进来。

比如,将foo函数定义为一个独立的函数,并将其放在一个名为foop.h的头文件中。然后在main.cpp中使用#include "foop.h"来包含头文件。这样就可以避免重复定义的问题。

以下是修改后的示例代码:

// foop.h
#ifndef FOOP_H
#define FOOP_H
void foo();
#endif
// foop.cpp
#include "foop.h"
void foo() {
    // function implementation
}
// main.cpp
#include "foop.h"
int main() {
    // function calls
    foo();
    return 0;
}

0
0 Comments

在C++中,包含一个.cpp文件是不被鼓励的,但也不是严格禁止的。虽然这样做可以成功编译,但可能会导致一些问题。问题的根源很可能是你同时编译了main.cpp和foop.cpp,这意味着会链接两个foop.cpp的副本。链接器会因为重复定义而报错。

要解决这个问题,有两种方法可以尝试。第一种方法是将foop.cpp的内容移动到一个新的头文件foop.h中,并将其包含在main.cpp中。这样可以避免重复定义的问题。下面是一个示例:

// foop.h
#ifndef FOOP_H
#define FOOP_H
void foo();
#endif
// main.cpp
#include "foop.h"
int main() {
    foo();
    return 0;
}
// foop.cpp
#include "foop.h"
void foo() {
    // implementation of foo
}

第二种方法是将foop.cpp编译为一个单独的目标文件,并在链接阶段将其与main.cpp一起链接。这样也可以避免重复定义的问题。下面是一个示例:

// main.cpp
void foo();
int main() {
    foo();
    return 0;
}
// foop.cpp
void foo() {
    // implementation of foo
}

然后,你可以使用以下命令行来编译和链接这两个文件:

g++ main.cpp foop.cpp -o program

通过使用上述方法,你可以避免在包含.cpp文件时出现重复定义的问题,并成功编译和链接你的程序。

0
0 Comments

include命令的作用是将文件中的所有内容复制到调用的文件中。因此,当预处理器完成工作后,main.cpp将会变成:

// iostream stuff
int foo(int a){
    return ++a;
}
int main(int argc, char *argv[])
{
   int x=42;
   std::cout << x <

在main.cpp中定义了foo函数,但是在foop.cpp中也存在函数定义,所以编译器会因为函数重复而产生困惑。

解决方法可以使用`#pragma once`指令来解决。

如果按照正确的方式(即包含头文件),main.cpp是不知道foo.cpp的存在的,因此也不会报错。这就是为什么我们要使用头文件的原因。在回答中,使用了一个main.cpp包含cpp文件的例子。在这种情况下,由于同一个函数在main.cpp和foo.cpp中都被定义了,会报错。

编译器不会报错,链接器会显示关于重复实现的错误。同时,如果将foo.cpp从链接中排除掉,即使没有使用`#pragma once`,构建也会成功。但是在大型项目中,这种方式会浪费编译器的时间,因为任何更改都会导致所有代码重新编译。

0