web-dev-qa-db-fra.com

Quelle est la différence entre la fonction void et la fonction void statique en C?

J'ai deux C fichiers.

file1.c

int main()
{
  func(); 
  return 0;  
}

file2.c

static void func(void)
{
  puts("func called");
}

Mais, si je compile le code ci-dessus avec la commande cc file2.c file1.c, J'ai le dessous,

undefined reference to `func'
collect2: error: ld returned 1 exit status

Mais, si je supprime le mot clé static à l'intérieur file2.c et compile le code ci-dessus avec la commande cc file2.c file1.c, Il est exécuté avec succès.

Donc, j'ai une question, Quelle est la différence entre la fonction void et la fonction void statique en C?

13
msc

Quelle est la différence entre la fonction void et la fonction void statique en C?

La vraie question devrait être quelle est la différence entre static et non-static une fonction? (le type de retour void n'est pas pertinent, il peut être int ou toute autre chose).

Le mot clé static est quelque peu sur-utilisé. Lorsqu'il s'applique à une fonction, cela signifie que la fonction a liaison interne , c'est-à-dire que sa portée est limitée à nité de traduction (simplement en tant que fichier source).

Par défaut, la fonction n'est pas statique et a une liaison externe. La fonction peut être utilisée par un fichier source différent.

Dans votre cas, l'erreur se manifeste car static func ne peut pas être utilisé dans un autre fichier source.


Quand faut-il utiliser les fonctions static?

Les fonctions static sont normalement utilisées pour éviter les conflits de noms dans les projets plus importants. Si vous inspectez la source du noyau Linux, exemple dans drivers/net vous verriez beaucoup static void fonctionne là-dedans. Les pilotes sont développés par différents fournisseurs et l'utilisation des fonctions static garantit qu'ils peuvent nommer les fonctions comme ils le souhaitent sans se soucier des conflits de noms avec d'autres développeurs de pilotes non liés.

28
artm