Pour répondre à la question, "le statique signifie-t-il qu'une seule copie de VAL est créée, dans le cas où l'en-tête est inclus par plus d'un fichier source?" ...
NON . VAL sera toujours défini séparément dans chaque fichier qui comprend l'en-tête.
Les normes pour C et C ++ provoquent une différence dans ce cas.
En C, les variables de portée fichier sont externes par défaut. Si vous utilisez C, VAL est statique et ANOTHER_VAL est externe.
Notez que les éditeurs de liens modernes peuvent se plaindre de ANOTHER_VAL si l'en-tête est inclus dans des fichiers différents (même nom global défini deux fois), et se plaindraient certainement si ANOTHER_VAL était initialisé à une valeur différente dans un autre fichier
En C ++, les variables de portée fichier sont statiques par défaut si elles sont const et extern par défaut si elles ne le sont pas. Si vous utilisez C ++, VAL et ANOTHER_VAL sont statiques.
Vous devez également tenir compte du fait que les deux variables sont désignées const. Idéalement, le compilateur choisirait toujours d'inline ces variables et de ne pas inclure de stockage pour elles. Il existe une multitude de raisons pour lesquelles le stockage peut être alloué. Ceux auxquels je peux penser ...
- options de débogage
- adresse prise dans le dossier
- le compilateur alloue toujours le stockage (les types const complexes ne peuvent pas être facilement insérés, cela devient donc un cas particulier pour les types de base)