Rumah >pembangunan bahagian belakang >C++ >Mengapa Anda Perlu Mengelak Memasukkan Fail .cpp Daripada Fail .h?

Mengapa Anda Perlu Mengelak Memasukkan Fail .cpp Daripada Fail .h?

Barbara Streisand
Barbara Streisandasal
2024-11-27 19:20:11989semak imbas

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

Termasuk Fail .cpp: Adakah Ia Memperkenalkan Pendua?

Dalam konteks pengaturcaraan, fail pengepala (.h) dan fail sumber (. cpp) memainkan peranan penting. Fail pengepala mengandungi pengisytiharan fungsi dan kelas, membolehkan modul lain berinteraksi dengannya. Walaupun pada umumnya disyorkan untuk memasukkan fail pengepala, persoalan timbul: Bolehkah anda memasukkan fail sumber (.cpp) secara langsung?

Jawapannya ialah "tidak". Termasuk fail .cpp boleh membawa kepada ralat definisi berbilang. Untuk memahami sebabnya, mari kita periksa kod berikut:

// 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;
}

Dengan fail pengepala disertakan, kod tersebut menyusun dan berjalan tanpa masalah. Walau bagaimanapun, katakan kita tersilap memasukkan fail sumber (.cpp) dan bukannya fail pengepala:

// 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;
}

Dalam senario ini, pengkompil membuat ralat:

multiple definition of foo(int)
first defined here

Apa yang menyebabkan kesilapan ini? Apabila prapemproses memasukkan fail sumber (.cpp), ia menyalin keseluruhan kandungan fail tersebut ke dalam fail semasa. Jadi, pada asasnya, kod berikut akan dihasilkan:

// 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;
}

Seperti yang anda lihat, fungsi foo() kini ditakrifkan dua kali dalam fail yang sama, yang membawa kepada ralat definisi berganda. Untuk mengelakkan isu ini, adalah penting untuk memasukkan fail pengepala (.h) dan bukannya fail sumber (.cpp). Fail pengepala mengisytiharkan fungsi dan kelas tanpa pelaksanaannya, menghalang pertindihan dan memastikan bahawa hanya satu definisi bagi setiap fungsi wujud dalam keseluruhan program.

Atas ialah kandungan terperinci Mengapa Anda Perlu Mengelak Memasukkan Fail .cpp Daripada Fail .h?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn