Accès à la fonction statique dans d'autres fichiers
Est-il une chance que la fonction Statique peut être évaluée à l'extérieur de la portée de fichier. ?
source d'informationauteur Arpit
Vous devez vous connecter pour publier un commentaire.
Est-il une chance que la fonction Statique peut être évaluée à l'extérieur de la portée de fichier. ?
source d'informationauteur Arpit
Vous devez vous connecter pour publier un commentaire.
Cela dépend ce que vous entendez par "accès". Bien sûr, la fonction ne peut pas être appelé par son nom dans n'importe quel autre fichier car il est
static
dans un autre fichier, mais vous avez un pointeur de fonction.Elle pourrait être appelée à partir de l'extérieur du champ d'application via un pointeur de fonction.
Par exemple, si vous avez eu:
alors une fonction en dehors de la portée peut appeler get_pointer() et utiliser le retour de pointeur de fonction à appeler transformer.
Non, sauf si il y a un bug dans le compilateur. Normalement la fonction statique de code n'est pas identifié avec un nom utilisé pour l'exportation de la fonction dans le fichier d'objet, de sorte qu'il n'est pas présenté à l'éditeur de liens et il ne peut tout simplement pas le lien.
Bien sûr, cela s'applique uniquement à l'appel de la fonction par son nom. Un autre code dans le même fichier peut obtenir la fonction de l'adresse et de la passer dans un non-statique de la fonction dans un autre fichier et ensuite la fonction à partir d'un autre fichier pouvez appeler votre fonction statique.
Il n'est pas accessible à l'extérieur d'un fichier par son nom. Mais, vous pouvez aussi bien l'attribuer à la fonction de pointeur et de l'utiliser partout où vous voulez.
"Accessible"? Cela dépend de ce que vous entendez par ce terme. Je suppose que quand vous dites "fonction statique" vous parlez de la fonction autonome déclaré
static
(c'est à dire déclarée avec une liaison interne), par opposition à la statique fonctions de membre de classe en C++, car ces derniers sont obviosly et facilement accessible à partir de n'importe où.Maintenant, une fonction autonome déclaré
static
a une liaison interne. Il ne peut pas être lié à de toute autre unité de traduction. Ou, en mettant les choses différemment, il ne peut pas être soumise à par nom de toute autre unité de traduction. Si c'est ce que tu entend par "accès depuis l'extérieur de la portée de fichier", alors non, il ne peut pas être fait.Toutefois, si les autres unités de traduction en quelque sorte obtenir un pointeur vers la fonction (c'est à dire si vous en quelque sorte permettre le pointeur de "fuite" dans le monde extérieur), alors n'importe qui peut encore appeler cette fonction en faisant un idirect les appeler et ainsi de "l'accès". Par exemple, si vous déclarez
alors en toute autre unité de traduction de l'utilisateur sera en mesure de le faire
et l'appel est acheminé à votre
foo_static
fonction. Je ne sais pas si ce genre d'accès est admissible à titre de "l'accès" à votre question.Suivant la norme, une fonction statique ne peut pas être accédé en dehors de la portée du fichier par nom parce qu'il est soumis à une liaison interne. C'est le nom n'est pas exporté, et ne les met pas à l'éditeur de liens. Cependant, il peut encore être accessibles et appelée par la fonction de pointeur, comme toute autre fonction.
Seulement avec la ruse. La fonction n'est généralement pas visible à l'éditeur de liens afin de ne pas vous laisser faire.
Mais, si vous fournir une fonction à l'intérieur de la même unité de compilation (comme la fonction statique) qui renvoie l'adresse de cette fonction:
Dans
main.c
:Dans
hidden.c
:Cela se traduira dans la fonction statique
get7
appelé.Non, le but du mot-clé static est de limiter la portée de la fonction de nom pour le fichier.