Je pense que tu deviens confus entre le sens de static
et const
ce qui est compréhensible que vous (et moi!) oublient souvent leur signification une fois que vous avez lu la théorie une fois.
1) Premièrement, const
. Ce que signifie const
, c'est que nous ne changerons pas la valeur de la variable par cette «référence». Ceci est vraiment utile pour les arguments de la fonction, en particulier lorsque vous utilisez des pointeurs, afin de ne pas éditer les valeurs que vous n'aviez pas l'intention de faire. Par exemple, arbitrairement:
void add(int* result, const int* a, const int* b)
Cette déclaration signifie que si nous accidentellement dactylographié a = result + b;
le compilateur doit se plaindre et refuser de compiler. Dans ce cas, nous avons nommé les variables de telle sorte que nous ne devrions pas les écraser même par accident, mais dans des scénarios plus complexes, cela peut arriver.
Comme l'indique pmg, cela ne signifie pas que la valeur ne changera pas; cela signifie simplement que lorsque nous parlons de cette version de cette adresse/valeur, nous ne la changerons pas. Mon point ici est qu'il est utile de protéger les arguments que vous n'avez pas l'intention de changer au cas où vous tenteriez accidentellement de les changer. Si vous voulez un préprocesseur à valeur fixe, vous pouvez souvent l'utiliser, par exemple. #define TRUE 1
.
2) maintenant static
. Statique signifie "non visible en dehors de cette unité de compilation". C'est comme, et je souligne comme, mais pas équivalent à, la notion de privé dans les classes, mais dans ce cas, nous parlons de l'ensemble du fichier C. Donc, si nous sommes dans le fichier helloworld.c
et en haut vous écrivez:
static int x = 10;
Vous ne pouvez pas utiliser alors cette version de x
en helloworld2.c
.
3) Pendant que nous y sommes, nous pourrions aussi bien faire l'autre mot inline
. inline
est en quelque sorte une façon plus agréable de faire des macros à mon avis et signifie "compilateur, vous devriez vraiment mettre le code résultant de là où vous l'appelez, plutôt que de nous coûter un appel de fonction". L'optimisation des compilateurs pourrait le faire de toute façon, mais cela agit comme une instruction explicite à intégrer si possible. En résumé, ces fonctionnalités contrôlent toutes les parties du langage et non l'endroit où la variable est placée dans les différents segments de l'exécutable. Comme le dit pmg, le compilateur peut faire ce qu'il veut.
Si vous voulez avoir une idée de ce que le compilateur a fait, utilisez gcc -S
. Cela vous donne la sortie en langage assembleur de gcc
qui sera au format AT & T. Essayez ceci avec différents gcc -Ox
où x=0,1,2,3
drapeaux pour avoir une idée du fonctionnement de l'optimisation.
Enfin, il est intéressant de noter qu'en fait a.out
est simplement un nom; votre noyau moderne est probablement compilé sans support pour les binaires a.out
. Je pense que c'est la question que vous essayiez vraiment de poser.
865 + 268 + 12 = 1145 = 0x479 – pmg