usar - variables estaticas java
¿Qué sucede cuando la declaración de función no estática sigue a la declaración de función estática? (2)
Por defecto las funciones son globales. Así que haciéndolo
static int foo() { return 1; }
La función foo()
es visible dentro de este archivo. Como solo tienes la declaración int foo();
esto está bien y bien definido si tiene una definición para el mismo int foo(){ return 2;}
entonces obtendrá un error de redefinición .
Según lo indicado por @haccks
6.2.1, la declaración posterior puede ocultar la declaración anterior.
Note la diferencia entre declaración y definición.
Lo siguiente compila:
static int foo() { return 1; }
int foo();
Pero, ¿se compilará siempre? ¿Está bien definido el comportamiento en este caso? ¿Y qué significa cuando un prototipo no estático sigue una declaración estática?
Sí se compilará y el comportamiento estará bien definido. Dado que foo
se declara static
antes que int foo();
1 , foo
tiene vinculación interna.
C11: 6.2.2 Enlaces de identificadores (p4):
Para un identificador declarado con el especificador de la clase de almacenamiento
extern
en un ámbito en el que es visible una declaración previa de ese identificador, 31) si la declaración anterior especifica un enlace interno o externo, el enlace del identificador en la declaración posterior es el mismo que El enlace especificado en la declaración anterior . [...]
y la nota al pie dice que:
31) Como se especifica en 6.2.1, la declaración posterior puede ocultar la declaración anterior.
1 . Si no se especifica una clase de almacenamiento, se supone que la función tiene un enlace externo. El estándar dice: Si la declaración de un identificador para una función no tiene un especificador de clase de almacenamiento, su vinculación se determina exactamente como si se declarara con el especificador de la clase de almacenamiento extern
- 6.2.2 (p5).