Description du problème
common.h définit tous les alias de type et déclarations de structure, est référencé par mass_diffusion.h et heat_conduction.h, mass_diffusion.h et heat_conduction.h sont Référencé par man.cpp, puis compilé avec succès, une erreur a été signalée lors de la liaisonLINK2005
。我已经使用了#ifndef ... #define ... #endif
Cette syntaxe défensive, chaque fichier n'a qu'une seule fonction d'initialisation exposée à l'extérieur Bien qu'il y ait des fonctions du même nom à l'intérieur du fichier, pourquoi ne sont-elles pas exposées. au monde extérieur ? Une erreur sera-t-elle signalée ?
Message d'erreur
Visual Studio 2017 compile l'erreur C++ : LNK2005 mass_diffusion.obj "void __cdecl calculate(class std::vector<struct user ,class std::allocator<struct user > > ,class std::vector<struct item ,class std::allocator<struct item > )" a été défini dans heat_conduction.obj.
Codes associés
//common.h
#ifndef _COMMON_H
#define _COMMON_H
...
struct user;
struct item;
struct relation;
...
typedef non signé int _container_number_;
typedef non signé int _value_number_;
. ..
typedef std::vecteur<user*> user_container;
typedef std::vector<item*> item_container;
#endif // !_COMMON_H
...
//mass_diffusion.h
#include "common.h"
extern void init_md(user_container, item_container);
void calculate(user_container _ulist, item_container _ilist);
...
//mass_diffusion.cpp
#include "mass_diffusion.h"
void init_md(user_container _ulist, item_container _ilist){...};
void calculate(user_container _ulist, item_container _ilist) {...};
...
//heat_conduction.h
# include "common.h"
extern void init_hc(user_container _ulist, item_container _ilist);
void calculate(user_container _ulist, item_container _ilist);
...
//heat_conduction.cpp
#include "heat_con duction .h"
void init_hc(user_container _ulist, item_container _ilist){...};
void calculate(user_container _ulist, item_container _ilist) {...};
...
//main. cpp
#include "mass_diffusion.h"
#include "heat_conduction.h"
Une erreur sera signalée à l'origine. Chacun de vos modules est lié au même fichier. L'éditeur de liens sera naturellement confus lorsqu'il verra autant de symboles portant le même nom. L'éditeur de liens ne se souciera pas de ce qui est exposé dans .h. La solution est de rendre chaque module indépendant. Compilez-le dans so ou dll, puis appelez-le ou utilisez un espace de noms
.