588 votes

Ce qui est une fonction « statique » ?

La question était sur la plaine de fonctions "C", pas de "C++" méthodes statiques, comme précisé dans les commentaires.

Ok, je comprends ce qu'est une variable statique, mais qu'est ce qu'un "statique" de la fonction?

Et pourquoi est-ce que si je déclare une fonction, disons-le, "nulle print_matrix", disons a.cpp (SANS un.hpp) et inclure "a.cpp" - je obtenir "print_matrix@@....) déjà défini dans un.obj", MAIS si je la déclarer "static void print_matrix" puis il compile?

Mise à JOUR Juste pour éclaircir les choses, je sais que dont ".rpc" est une mauvaise chose, comme beaucoup d'entre vous l'avez souligné, je le fais juste pour désactivez temporairement de l'espace dans main.cpp jusqu'à ce que j'ai une meilleure idée de la façon de groupe de l'ensemble de ces fonctions dans les .hpp et .rpc. Juste un temporaire, solution rapide.

774voto

Johannes Weiß Points 19013

fonctions statiques sont des fonctions qui ne sont visibles qu’à d’autres fonctions dans le même fichier.

EDIT: pour ceux qui pensaient, que l’auteur des questions signifiait une méthode de « classe » : non, il signifie une ancienne plaine C fonction. Pour les méthodes de la classe, `` signifie évidemment que cette méthode peut être appelée sur la classe elle-même, aucune instance de cette classe nécessaire.

216voto

Dima Points 19888

Il y a une grande différence entre les fonctions statiques en C et les fonctions membres statiques en C++. En C, une fonction statique n'est pas visible à l'extérieur de son unité de traduction, qui est le fichier de l'objet il est compilé en. En d'autres termes, faire une fonction statique des limites de son champ d'application. Vous pouvez penser à une fonction statique comme étant "privé" de sa *.c fichier (même si cela n'est pas strictement exact).

En C++, "statique" s'applique à des fonctions de membre et de données des membres de classes. Une donnée membre statique est aussi appelée "variable de classe", alors qu'un non-membre de données statiques est une "variable d'instance". C'est Smalltalk terminologie. Cela signifie qu'il n'existe qu'une seule copie d'une donnée membre statique partagée par tous les objets d'une classe, alors que chaque objet possède sa propre copie d'un non-membre de données statiques. Donc une donnée membre statique est essentiellement une variable globale, qui est un membre d'une classe.

Non-fonctions membres statiques peuvent accéder à toutes les données membres de la classe: statiques et non statiques. Fonctions membres statiques ne peut fonctionner que sur les données membres statiques.

Une façon de penser, c'est qu'en C++ statique membres de données et fonctions membres statiques n'appartiennent pas à n'importe quel objet, mais à l'ensemble de la classe.

76voto

Brian Neal Points 13668

Il y a deux utilisations pour le mot-clé static quand il s'agit de fonctions en C++.

La première consiste à marquer la fonction comme ayant une liaison interne de sorte qu'il ne peut pas être référencée dans d'autres unités de traduction. Cette utilisation est déconseillée en C++. Sans nom les espaces de noms sont privilégiées pour ce type d'utilisation.

// inside some .cpp file:

static void foo();    // old "C" way of having internal linkage

// C++ way:
namespace
{
   void this_function_has_internal_linkage()
   {
      // ...
   }
}

La deuxième utilisation est dans le contexte d'une classe. Si une classe a une fonction membre statique, ce qui signifie que la fonction membre de la classe (et a l'habitude d'accéder à d'autres membres), mais il n'a pas besoin d'être invoquée par l'intermédiaire d'un objet particulier. En d'autres termes, à l'intérieur de cette fonction, il n'y a pas de pointeur "this".

21voto

Simon D. Seim Points 150

La suite est sur la plaine de fonctions C - dans une classe C++ le modificateur 'statique' a une autre signification.

Si vous avez un seul fichier, ce modificateur ne fait absolument aucune différence. La différence est dans les grands projets, avec de multiples fichiers:

En C, chaque "module" (une combinaison de l'échantillon.c et l'échantillon.h) est compilé de manière indépendante et par la suite tous ces compilé les fichiers objets (échantillon.o) sont liées à un fichier exécutable par l'éditeur de liens.

Disons que vous avez plusieurs fichiers que vous incluez dans votre fichier principal et deux d'entre eux ont une fonction qui est utilisé uniquement en interne pour des raisons de commodité appelés add(int a, b) - le compilateur de créer facilement des fichiers objets pour ces deux modules, mais l'éditeur de liens lèvera une erreur, car il s'y trouve deux fonctions avec le même nom et il ne sait pas à qui il doit utiliser (même si il n'y a rien pour le lien, parce qu'ils ne sont pas utilisés ailleurs, mais dans son propre fichier).

C'est pourquoi vous faites cette fonction, qui est utilisé uniquement en interne, une fonction statique. Dans ce cas, le compilateur ne crée pas le typique "vous pouvez lier cette chose"-drapeau pour l'éditeur de liens, de sorte que l'éditeur de liens ne vois pas cette fonction et ne génère pas d'erreur.

16voto

Douglas Leeder Points 29986

La première: C'est généralement une mauvaise idée d'inclure une .cpp le fichier dans un autre fichier - elle conduit à des problèmes comme ça :-) La voie normale est de créer des unités de compilation, et ajouter un en-tête de fichier pour le fichier inclus.

Deuxièmement:

C++ a une certaine confusion terminologique ici, je ne le savais pas à ce sujet jusqu'à ce que souligné dans les commentaires.

a) static functions - hérité de C, et de ce dont vous parlez ici. En dehors de toute classe. Une statique de la fonction signifie qu'il n'est pas visible en dehors de l'actuelle unité de compilation - donc dans votre cas.obj en a une copie de votre code a une copie indépendante. (Ballonnements l'exécutable final avec plusieurs copies du même code).

b) static member function - ce que l'Orientation de l'Objet, un statique de la méthode. Vit à l'intérieur d'une classe. Vous appelez cela avec la classe plutôt que par le biais d'une instance d'objet.

Ces deux types de fonction statique définitions sont complètement différents. Attention, ici il y a des dragons.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X