首页 >后端开发 >C++ >为什么应该避免包含 .cpp 文件而不是 .h 文件?

为什么应该避免包含 .cpp 文件而不是 .h 文件?

Barbara Streisand
Barbara Streisand原创
2024-11-27 19:20:11931浏览

Why Should You Avoid Including .cpp Files Instead of .h Files?

包含 .cpp 文件:是否会引入重复项?

在编程上下文中,头文件 (.h) 和源文件 (. cpp)发挥着至关重要的作用。头文件包含函数和类声明,使其他模块能够与它们交互。虽然通常建议包含头文件,但出现了一个问题:您可以直接包含源文件 (.cpp) 吗?

答案是响亮的“不”。包含 .cpp 文件可能会导致多个定义错误。要了解原因,让我们检查以下代码:

// main.cpp
#include <iostream>
#include "foop.h"

int main() {
  int x = 42;
  std::cout << x << std::endl;
  std::cout << foo(x) << std::endl;
  return 0;
}
// foop.h
#ifndef FOOP_H
#define FOOP_H
int foo(int a);
#endif
// foop.cpp
int foo(int a) {
  return ++a;
}

包含头文件后,代码编译和运行不会出现问题。但是,假设我们错误地包含了源文件 (.cpp) 而不是头文件:

// main.cpp
#include <iostream>
#include "foop.cpp"

int main() {
  int x = 42;
  std::cout << x << std::endl;
  std::cout << foo(x) << std::endl;
  return 0;
}

在这种情况下,编译器会抛出错误:

multiple definition of foo(int)
first defined here

导致的原因这个错误?当预处理器包含源文件 (.cpp) 时,它会将该文件的全部内容复制到当前文件中。因此,本质上,将生成以下代码:

// main.cpp
#include <iostream>

int foo(int a) {
  return ++a;
}

int main() {
  int x = 42;
  std::cout << x << std::endl;
  std::cout << foo(x) << std::endl;
  return 0;
}

如您所见,函数 foo() 现在在同一文件中定义了两次,导致多重定义错误。为了避免此问题,包含头文件 (.h) 而不是源文件 (.cpp) 至关重要。头文件声明函数和类,但不声明其实现,从而防止重复并确保整个程序中每个函数仅存在一个定义。

以上是为什么应该避免包含 .cpp 文件而不是 .h 文件?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn