tipos retorno prototipo parametros lenguaje funciones funcion ejemplos con c static-functions

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