C'était en quelque sorte répondu ci-dessus, mais je vais essayer de mettre les choses dans leur contexte.
Tout d'abord, C est venu en premier. En tant que tel, ce que le C n'est, en quelque sorte, le "par défaut". Il n'a pas de mutilation des noms, parce que cela ne fonctionne tout simplement pas. Un nom de fonction est un nom de fonction. Mondial mondial, et ainsi de suite.
Alors C++ est venu le long. C++ voulais être en mesure d'utiliser le même linker que le C, et être en mesure de lier avec le code écrit en C. Mais le C++ ne pouvait pas laisser le C "déformation" (ou absence de). Découvrez l'exemple suivant:
int function(int a);
int function();
En C++, ce sont des fonctions distinctes, avec des organes distincts. Si aucun d'entre eux sont déformés, les deux sera appelée "fonction" (ou "_function"), et l'éditeur de liens se plaindre au sujet de la redéfinition d'un symbole. C++ solution était de marquer les types d'arguments dans le nom de la fonction. Donc, on est appelés _function_int
et l'autre est appelé _function_void
(pas à proprement parler un régime de déformation) et la collision est évitée.
Maintenant, nous sommes de gauche avec un problème. Si int function(int a)
a été défini dans un module C, et nous en sommes simplement à la prise de son en-tête (c'est à dire de la déclaration) du code C++ et en l'utilisant, le compilateur va générer une instruction de l'éditeur de liens pour importer _function_int
. Lorsque la fonction a été définie, dans le module C, il n'a pas été appelé. Il a été appelé _function
. Ce sera la cause d'une erreur de l'éditeur de liens.
Pour éviter cette erreur, lors de la déclaration de la fonction, de nous dire au compilateur, c'est une fonction conçue pour être reliée à, ou compilé par un compilateur C:
extern "C" int function(int a);
Le compilateur C++ sait maintenant d'importer _function
plutôt que d' _function_int
, et tout est bien.