fonction statique en C
Qu'est-ce que le point de faire une fonction statique en C?
- Il n'y a pas de telles choses comme les "méthodes" en C++. Je pense que vous avez confondu avec Objective-C.
- Nah, je suis confus avec Python. Une fonction à l'intérieur d'une classe est appelé une méthode en Python.
- double possible de qu'est Ce qu'un "statique" de la fonction? (en C)
Vous devez vous connecter pour publier un commentaire.
Faire une fonction
static
masque à partir d'autres unités de traduction, qui permet de fournir l'encapsulation.helper_file.c
principal.c:
#include <helper_file.c>
? Je pense que ce serait faire une seule unité de traduction, puis...gcc -std=c99 -pedantic -Wall -Wextra main.c helper_file.c
. Les prototypes de ces fonctions sont présentes dans les deux fichiers source (pas besoin de fichiers d'en-tête). L'éditeur de liens résoudre les fonctions.static
. Cette dernière pratique semble de plus en plus commun dans la nature. Veuillez expliquer si je me trompe, je suis un peu brumeux sur ce point, même si c'est de base.static
l'éditeur de liens peut trouver, même sans un prototype. L'absence du prototype empêche le compilateur de vérifier de retour et les types des paramètres, pas d'émission de code qui appelle la fonction.pmg est sur place à propos de l'encapsulation; au-delà de la clandestinité de la fonction à partir d'autres unités de traduction (ou plutôt, parce que de celui-ci), fonctions de prise de
static
peut également conférer des avantages de performance, en présence des optimisations du compilateur.Parce qu'un
static
fonction ne peut être appelée depuis n'importe où en dehors de l'actuelle unité de traduction (à moins que le code prend un pointeur vers son adresse), le compilateur gère tous les appels de points d'elle.Cela signifie qu'il est gratuit pour une utilisation non-standard ABI, en ligne entièrement, ou d'accomplir un certain nombre d'autres optimisations qui pourrait ne pas être possible pour une fonction de liaison externe.
static
fonction s'échappe de l'actuelle unité de traduction, alors que la fonction peut être appelé directement à partir d'autres unités de traduction.La
static
mot-clé dans C est utilisé dans un fichier compilé (.c comme opposés .h) de sorte que la fonction n'existe que dans ce fichier.Normalement, lorsque vous créez une fonction, le compilateur génère les fichiers inutiles à l'éditeur de liens pouvez utiliser pour, ainsi, le lien d'un appel de fonction à cette fonction. Si vous utilisez le mot-clé static, d'autres fonctions dans le même fichier peut appeler cette fonction (car il peut être fait sans avoir recours à l'éditeur de liens), tandis que l'éditeur de liens n'a aucune information laissant d'autres fichiers pour accéder à la fonction.
En regardant les posts ci-dessus, je tiens à souligner un détail.
Supposons que notre fichier principal ("main.c") ressemble à ceci:
Maintenant, considérons trois cas:
Cas 1:
Notre fichier d'en-tête ("en-tête.h") ressemble à ceci:
Ensuite la commande suivante sous linux:
réussira! Suivant que si on court
La sortie sera
L'appel de fonction à l'intérieur de l'en-tête
Qui est ce que statique de la fonction d'impression.
Cas 2: Notre fichier d'en-tête ("en-tête.h") ressemble à ceci:
et nous avons aussi un autre fichier d'en-tête.c", qui ressemble à ceci:
Ensuite la commande suivante
donnera une erreur.
Cas 3:
Similaire pour le cas 2, sauf que maintenant notre fichier d'en-tête ("en-tête.h") est:
Puis la même commande que dans le cas 2 va réussir, et la poursuite de l'exécution de ./principal sera de donner le résultat attendu.
Donc à partir de ces tests (exécuté sur Acer machine x86, Ubuntu OS) j'ai fait l'hypothèse que
mot-clé static empêche fonction définie dans un autre fichier que celui où elle est déclarée.
Corrigez-moi si je me trompe.
C programmeurs utilisent l'attribut static pour masquer les variables et les déclarations de fonction à l'intérieur des modules,
beaucoup comme vous le feriez publics et privés, les déclarations en Java et C++. Fichiers source C de jouer le rôle de
les modules. Toute variable globale ou d'une fonction déclarée avec l'attribut static est privé de ce module.
De même, toute variable globale ou d'une fonction déclarée sans l'attribut static est public et peut être
accessible par n'importe quel autre module. Il est bien pratique pour protéger vos variables et de fonctions
avec l'attribut static dans la mesure du possible.
pmg la réponse est très convaincant. Si vous voulez savoir comment statique déclarations de travail au niveau de l'objet puis cette info ci-dessous pourrait être intéressant pour vous.
J'ai réutilisé le même programme écrit par pmg et le compilateur en un .donc(shared object) un fichier
Contenus suivants sont après le dumping .si le fichier en quelque chose de lisible par l'homme
0000000000000675 f1: l'adresse de la fonction f1
000000000000068c f2: adresse de f2(staticc) fonction
noter la différence entre la fonction de l'adresse , il signifie quelque chose . Pour une fonction déclarée avec adresse différente , il peut très bien signifier que f2 vit très loin ou dans un segment différent de l'objet fichier.
Linkers utiliser ce qu'on appelle PLT(Procedure linkage table) et a OBTENU(Global des décalages de table) afin de comprendre les symboles qu'ils ont accès à un lien .
Pour l'instant pense que le GOT et la PLT comme par magie se lier à toutes les adresses et dynamique section contient des informations de toutes ces fonctions qui sont visibles par l'éditeur de liens.
Après vidage de la dynamique de la section .donc, fichier nous obtenons un tas d'entrées mais seulement intéressé dans f1 et f2 fonction.
La partie dynamique est titulaire d'entrée uniquement pour f1 de la fonction à l'adresse 0000000000000675 et pas pour f2 !
Num: Valeur De Type Taille Lier Vis Ndx Nom
Et c'est tout !. À partir de ce son clair que l'éditeur de liens ne seront pas réussi à trouver la f2 fonction puisqu'elle n'est pas dans la partie dynamique de l' .si le fichier.