Maison > développement back-end > C++ > Pourquoi devriez-vous éviter d'inclure des fichiers .cpp au lieu de fichiers .h ?

Pourquoi devriez-vous éviter d'inclure des fichiers .cpp au lieu de fichiers .h ?

Barbara Streisand
Libérer: 2024-11-27 19:20:11
original
931 Les gens l'ont consulté

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

Inclure les fichiers .cpp : introduit-il des doublons ?

Dans un contexte de programmation, les fichiers d'en-tête (.h) et les fichiers source (. cpp) jouent un rôle crucial. Les fichiers d'en-tête contiennent des déclarations de fonctions et de classes, permettant à d'autres modules d'interagir avec elles. Bien qu'il soit généralement recommandé d'inclure les fichiers d'en-tête, une question se pose : pouvez-vous inclure directement les fichiers source (.cpp) à la place ?

La réponse est un « non » catégorique. L'inclusion de fichiers .cpp peut entraîner plusieurs erreurs de définition. Pour comprendre pourquoi, examinons le code suivant :

// 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;
}
Copier après la connexion
// foop.h
#ifndef FOOP_H
#define FOOP_H
int foo(int a);
#endif
Copier après la connexion
// foop.cpp
int foo(int a) {
  return ++a;
}
Copier après la connexion

Avec le fichier d'en-tête inclus, le code se compile et s'exécute sans problème. Cependant, disons que nous incluons par erreur le fichier source (.cpp) au lieu du fichier d'en-tête :

// 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;
}
Copier après la connexion

Dans ce scénario, le compilateur renvoie une erreur :

multiple definition of foo(int)
first defined here
Copier après la connexion

Qu'est-ce qui cause cette erreur ? Lorsque le préprocesseur inclut un fichier source (.cpp), il copie l'intégralité du contenu de ce fichier dans le fichier actuel. Ainsi, essentiellement, le code suivant serait généré :

// 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;
}
Copier après la connexion

Comme vous pouvez le constater, la fonction foo() est désormais définie deux fois dans le même fichier, entraînant une erreur de définition multiple. Pour éviter ce problème, il est crucial d'inclure les fichiers d'en-tête (.h) au lieu des fichiers source (.cpp). Les fichiers d'en-tête déclarent des fonctions et des classes sans leurs implémentations, empêchant ainsi la duplication et garantissant qu'une seule définition de chaque fonction existe dans l'ensemble du programme.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal