Para responder a la pregunta, "¿la estática significa que solo se crea una copia de VAL, en caso de que el encabezado esté incluido en más de un archivo fuente?" ...
NO . VAL siempre se definirá por separado en cada archivo que incluya el encabezado.
Los estándares para C y C ++ causan una diferencia en este caso.
En C, las variables de ámbito de archivo son externas de forma predeterminada. Si está utilizando C, VAL es estático y ANOTHER_VAL es externo.
Tenga en cuenta que los enlazadores modernos pueden quejarse de ANOTHER_VAL si el encabezado se incluye en archivos diferentes (el mismo nombre global se define dos veces), y definitivamente se quejarían si se inicializara ANOTHER_VAL con un valor diferente en otro archivo
En C ++, las variables de ámbito de archivo son estáticas de forma predeterminada si son constantes y externas de forma predeterminada si no lo son. Si está utilizando C ++, tanto VAL como ANOTHER_VAL son estáticos.
También debe tener en cuenta el hecho de que ambas variables se designan const. Idealmente, el compilador siempre elegiría alinear estas variables y no incluir ningún almacenamiento para ellas. Hay una gran cantidad de razones por las que se puede asignar almacenamiento. Los que puedo pensar ...
- opciones de depuración
- dirección tomada en el archivo
- El compilador siempre asigna almacenamiento (los tipos const complejos no se pueden insertar fácilmente, por lo que se convierte en un caso especial para los tipos básicos)