Question

Je suis récemment tombé sur la question suivante : comment accéder à une variable déclarée statique dans file1.c vers un autre file2.c ?

Est-il possible d'accéder à une variable statique ?

Ma compréhension du mot-clé statique en C est la suivante :

static est un "lien interne", ils ne sont donc accessibles qu'à partir d'une seule unité de compilation - celle où ils ont été définis.Les objets déclarés avec un lien interne sont privés d'un seul module.

Comme l'un de mes amis me suggère la solution ci-dessous.

Dans file1.c

   #include <stdio.h>

   int main()
   {
          int b=foo();
          printf("%d",b);
          return 0;
   }

dans file2.c

   static int a=25;

   int foo()
   {
        return a;
   }

compilé par gcc file1.c file2.c -o file

Si je fais ci-dessus, je peux accéder à la variable.

Mes questions sont donc :

  1. Le programme ci-dessus viole-t-il les règles des variables statiques ?

  2. Sinon, pourquoi en est-il ainsi et existe-t-il un autre moyen d'accéder à une variable statique, à l'exception de l'inclusion d'un fichier (#include <…>) pas comme ça.

    Comment puis-je accéder à une variable statique à partir d’un autre fichier ?

    En C, comment limiter la portée d'une variable globale au fichier dans lequel elle est déclarée ?

  3. Corrigez-moi si je me trompe avec le concept de variable statique et si de meilleures solutions sont disponibles pour accéder à la variable statique ?

Était-ce utile?

La solution

1) le programme ci-dessus viole-t-il les règles des variables statiques ?

Non, vous ne respectez aucune règle.Ici, la fonction foo crée une copie de la valeur de cette variable statique et est utilisée dans un autre fichier.C'est bon.

2) Si ce n'est pas le cas, pourquoi en est-il ainsi et existe-t-il un autre moyen d'accéder à une variable statique, à l'exception de l'inclusion d'un fichier (#include<>), pas comme celui-ci. Comment puis-je accéder à une variable statique à partir d'un autre fichier ?

Les variables statiques sont uniquement destinées à être utilisées dans ce fichier uniquement.

Vous ne pouvez pas utiliser cette variable en la rendant externe dans d'autres fichiers.

Un autre sale hack consiste à obtenir le pointeur de cette variable statique et à en faire un pointeur global et à le rendre externe dans un autre fichier, vous pouvez utiliser cette variable statique.

fichier1.c

 #include<stdio.h>
  static int a=25;
  int* ptr = &a;

fichier2.c

#include<stdio.h>
extern int *ptr;

   int main()
   {
          printf("%d",*ptr);
          return 0;
   }

Corrigez-moi si je me trompe avec le concept de variable statique et si de meilleures solutions sont disponibles ?

  1. Une variable statique a une durée de vie qui s'étend sur toute l'exécution du programme

  2. Si vous n'initialisez pas la variable statique avec une valeur, sa valeur par défaut sera 0.

  3. Une variable statique a une portée limitée à son fichier uniquement.Vous ne pouvez pas y accéder par votre nom à partir d'un autre fichier.

  4. Vous avez temp1.c et temp2.c tous deux compilés ensemble, vous pouvez également avoir une variable statique du même nom dans les deux fichiers - et ce sont des variables distinctes.

En C, comment limiter la portée d'une variable globale au fichier dans lequel elle est déclarée ?

En rendant cette variable globale statique.

Autres conseils

Ce que nous appelons communément une variable en C est en réalité deux choses :un objet, la mémoire allouée à la variable interprétée avec un certain type, et un identifiant, une façon d'accéder à cet objet.

Il n'y a aucun problème pour accéder à un static objet ou sa valeur provenant d'une autre unité de compilation.Votre fonction foo promeut la valeur vers une autre unité, c'est bien, mais cela pourrait même promouvoir l'adresse de a sans problème.

Avoir du lien interne ne concerne que l'identifiant, le nom a.Celui-ci n'est visible qu'à l'intérieur file2.c.

Avec le static int a=25; la variable a aura un lien interne ;ce qui signifie que l'éditeur de liens ne peut pas voir a n'importe où en dehors du file2.c TU.

Quand tu appelles foo() dans file2.c, vous obtenez une copie de a, c'est la copie que vous imprimez ;mais cela ne signifie pas que vous avez accès au véritable a défini dans file2.c Lorsque vous avez besoin d'un tel accès où la même variable est visible sur différentes TU, vous pouvez le faire

Définition du fichier

Ce fichier déclare et définit à la fois la variable ;l'initialise également à 1, sans quoi il sera initialisé par défaut à 0.

// (non-static) global variable with external linkage and thus visible across TUs
int var_across = 0;
void use()
{
   var_across = 1;
}

Utilisation du fichier

// just a declaration to tell that it's defined elsewhere; not a definition
extern int var_across;
void use_here()
{
   var_across = 2;
}

L'attribution de l'adresse de la variable statique au pointeur rendra la variable statique disponible pour les sous-fichiers.

Dans les sous-fichiers, nous devons utiliser le mot-clé extern vers le pointeur.

Mais ce n’est pas nécessaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top