Comment gérer le nom de la fonction dupliquée dans C?
J'ai un petit projet que j'ai nommé deux même nom de fonction dans deux différentes fichier source, mais si j'ai la construction du projet, le compilateur n'a pas avec " func_name déjà définis dans le nom de fichier.obj'.
Pourquoi ne pourrais-je avoir deux fonctions ayant le même nom dans deux différents fichiers source? Je pensais que la fonction doit être local pour le fichier source que si nous avons déclaré dans le fichier d'en-tête il va devenir mondiale.
Et, sauf pour modifier le nom de fichier, il y a aucune autre solution élégante pour dupliqué nom de la fonction dans le langage de programmation C?
source d'informationauteur Jichao
Vous devez vous connecter pour publier un commentaire.
En C, une fonction a une portée globale par défaut. Afin de limiter son champ d'application, utilisez la
static
mot-clé pour le rendre privé à un module.Le rôle de l'en-tête de fichier est juste pour faire connaître la fonction ainsi que sa signature aux autres modules.
Globale de tous les noms (avec quelques mises en garde) être unique. Cela a un sens, car ce nom est utilisé par l'éditeur de liens pour connecter un appel de fonction pour la mise en œuvre de la fonction elle-même.
Noms statique et une portée locale seulement besoin d'être unique à l'intérieur de leur portée.
Si quelque chose est déclarée dans le fichier d'en-tête ou dans le fichier source ne fait absolument aucune différence pour le compilateur. En fait, le compilateur approprié sait absolument rien sur tout "fichiers d'en-tête", puisque les fichiers d'en-tête sont intégrées dans les fichiers source par des préprocesseurqui fait son travail avant de le compilateur proprement dit. Par le temps que les fichiers source (avec des fichiers d'en-tête) d'obtenir la réelle compilateuril n'y a aucun moyen de dire ce qui était là à l'origine, et ce qui a été inséré à partir de fichiers d'en-tête. Le fichier source avec tous les fichiers d'en-tête intégré à elle est appelée de l'unité de traduction. I. e. le compilateur bon travaille avec les unités de traduction, pas avec certains "source" ou "header" fichiers.
En langage C, et tous les objets et les fonctions déclarées dans le fichier portée liaison externe par défaut, ce qui signifie qu'ils sont au niveau mondial, unique pour l'ensemble du programme. Donc, vous avez pensé de manière incorrecte. Les fonctions ne sont pas locaux pour un fichier source.
Si vous voulez faire une fonction (ou un objet) local à une seule unité de traduction, vous devez prendre certaines étapes explicites. Vous devez le déclarer comme
static
. Déclarant comme statique donnera liaison internece qui signifie essentiellement qu'il devient interne à son unité de traduction.Déclaration de vos fonctions
static
ne fonctionnera que si les deux d'entre eux ont vraiment des locaux, de leurs propres unités de traduction. Si ce n'est pas le cas, c'est à dire si au moins l'une des fonctions devrait être accessible dans le monde entier (couplés) de la fonction, alors vous n'avez pas d'autre choix que de renommer l'une des fonctions.Parce que l'éditeur de liens doit savoir ce qui est signifié quand vous faites référence.
Imaginer que
a.h
etb.h
déclarermy_function()
. Le compilateur génère du code pour les deux. Maintenant, imaginez quec.c
appelsmy_function()
- comment fonctionne l'éditeur de liens de savoir laquelle des deux versions de la fonction doit être appelée?Déclarer la fonction
static
à faire local dans le fichier. En C, chaque identificateur de nom doit être unique.La solution élégante est des espaces de noms introduit en C++. La solution, si il y a peu d'appels à func_name est prendre un, de le renommer et de le recompiler.
Quelque chose hackerous mais solution rapide pourrait être présent: