98 votes

Quelle est la différence entre static const et const ?

Quelle est la différence entre static const y const ? Par exemple :

static const int a=5;
const int i=5;

Y a-t-il une différence entre eux ? Quand utiliseriez-vous l'un plutôt que l'autre ?

125voto

Joe Points 1932

static détermine la visibilité à l'extérieur d'une fonction ou la durée de vie d'une variable à l'intérieur. Cela n'a donc rien à voir avec const en soi.

const signifie que vous ne modifiez pas la valeur après qu'elle a été initialisée.

static à l'intérieur d'une fonction signifie que la variable existera avant et après l'exécution de la fonction.

static en dehors d'une fonction signifie que la portée du symbole marqué static est limité à ce fichier .c et ne peut être vu en dehors de celui-ci.

Techniquement (si vous voulez vérifier), static est un spécificateur de stockage et const est un qualificatif de type.

68voto

ouah Points 75311

La différence est le lien.

// At file scope
static const int a=5;  // internal linkage
const int i=5;         // external linkage

Si le i n'est pas utilisé en dehors de l'unité de traduction où il est défini, vous devez le déclarer avec la balise static spécificateur.

Cela permet au compilateur d'effectuer (potentiellement) d'autres optimisations et informe le lecteur que l'objet n'est pas utilisé en dehors de son unité de traduction.

1voto

nibot Points 5057

Cela dépend si ces définitions sont à l'intérieur d'une fonction ou non. La réponse pour le cas à l'extérieur de une fonction est donnée par ouah, ci-dessus. À l'intérieur de d'une fonction, l'effet est différent, illustré par l'exemple ci-dessous :

#include <stdlib.h>

void my_function() {
  const int foo = rand();         // Perfectly OK!
  static const int bar = rand();  // Compile time error.
}

Si vous voulez qu'une variable locale soit "réellement constante", vous devez la définir non seulement "const" mais "static const".

0voto

Tobin Points 1
const int i=5;  

i que vous pouvez modifier en utilisant un pointeur si i est défini et déclaré localement, si elle est static const int a=5; o const int i=5; Globalement, vous ne pouvez pas le modifier car il est stocké dans la mémoire du RO dans le segment de données.

    #include <stdio.h>
   //const int  a=10;              /* can not modify */
   int main(void) {
   // your code goes here

   //static const int const a=10;   /* can not modify */
   const int  a=10; 
   int *const ptr=&a;
   *ptr=18;
   printf("The val a is %d",a);
   return 0;
}

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