retorno - tipos de funciones en c
¿Una función estática necesita la palabra clave estática para el prototipo en C? (2)
Mi libro de programación C dice que cuando quiero crear una función estática, necesito poner la palabra clave estática delante de la definición de la función. No menciona nada explícitamente sobre el prototipo. Además, los ejemplos no usan prototipos y simplemente colocan las funciones estáticas en la parte superior del archivo (para que no necesiten prototipos, supongo).
Entonces, ¿una función estática necesita la palabra clave estática para el prototipo? ¿O solo lo pongo frente a la definición?
No. Una declaración de función (prototipo o incluso la definición) puede omitir la palabra clave static
si aparece después de otra declaración de la misma función con static
.
Si hay una declaración static
de una función, su primera declaración debe ser static
.
Se define en ISO / IEC 9899: 1999, 6.7.1:
Si la declaración de un identificador de ámbito de archivo para una [...] función contiene el especificador de clase de almacenamiento
static
, el identificador tiene un enlace interno.[...]
Para un identificador declarado con el especificador de clase de almacenamiento
extern
en un ámbito en el que una declaración previa de ese identificador es visible, si la declaración previa 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 previa.[...]
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 hubiera declarado con el especificador de clase de almacenamiento
extern
.[...]
Si, dentro de una unidad de traducción, aparece el mismo identificador con enlace interno y externo, el comportamiento no está definido.
Entonces, por ejemplo, esto es válido:
static void foo(void);
void foo(void);
static void foo(void) { }
Este también:
static void foo(void) { }
void foo(void);
static void bar(void);
void bar(void) {}
Pero este código es incorrecto:
void foo(void);
static void foo(void) { }
Normalmente, usted y debería tener la static
en los prototipos también (porque generalmente son los primeros).
sí, sí, necesitas poner estática delante de la declaración.
escribe esto en ideone.com
int add();
int main(){
printf("%d",add());
return 0;
}
static int add(){
return 1+1;
}
obtienes este resultado: http://ideone.com/VzZCiE
ahora escribe esto
static int add();
int main(){
printf("%d",add());
return 0;
}
static int add(){
return 1+1;
}
obtienes esto: http://ideone.com/sz8HVR
boooom