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
Lepaskan: 2024-11-27 19:20:11
asal
930 orang telah melayarinya

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;
}
Salin selepas log masuk
// foop.h
#ifndef FOOP_H
#define FOOP_H
int foo(int a);
#endif
Salin selepas log masuk
// foop.cpp
int foo(int a) {
  return ++a;
}
Salin selepas log masuk

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;
}
Salin selepas log masuk

Dalam senario ini, pengkompil membuat ralat:

multiple definition of foo(int)
first defined here
Salin selepas log masuk

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;
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan