2011-10-18 14 views
5

ver en un código fuente del proyecto que he visto belows declaración¿cuál es la ventaja de la función estática?

static int *foo(); 

por lo que declaran foo como función estática regresar puntero a int. Así que aquí me pregunto ¿cuál es el propósito de declarar la función como estática?

+0

lol @ James: 'estática doble *** Bzzzt();' – pmg

Respuesta

9

El nombre de la función no está visible fuera de la unidad de traducción (archivo fuente) en el que está declarada, y no entrará en conflicto con otra función foo en otro archivo fuente.

En general, las funciones probablemente deberían declararse static a menos que tenga una necesidad específica de llamarlo desde otro archivo fuente.

(Tenga en cuenta que es sólo el nombre que no es visible. Todavía se puede llamar desde cualquier parte del programa a través de un puntero.)

+0

¿cómo puedo llamar con el puntero? –

+0

@ Mr.32 Buscar "puntero de función". – cnicutar

+1

¿Cuál es la diferencia entre marcar una función como estática y simplemente no incluirla en el encabezado? ¿No lo omitirá desde el encabezado tendrá el mismo efecto? ¿O hay alguna razón para no poner algo en el encabezado y tampoco marcarlo como estático? – Alex

2

Impide que otras unidades de traducción (archivos .c) vean la función. Mantiene las cosas limpias y ordenadas. Una función sin static es extern por defecto (es visible para otros módulos).

+0

no conseguir ..... –

+0

@JamesMcNellis editados. – cnicutar

1

Declarar una función como static impide que otros archivos accedan a ella. En otras palabras, solo es visible para el archivo en el que fue declarado; una función "local".

También podría relacionar static (declaración de función, palabra clave, no variable) en C como private en lenguajes orientados a objetos.

Consulte here para ver un ejemplo.

+1

La pregunta es sobre [etiqueta: c]. ¿Qué es una "clase"? –

+0

me preocupo más por c ... no sé class & C++ –

+1

@Keith: Disculpas: he estado codificando únicamente en Java durante el último mes. –

1

Marcado de una función o una variable global como static hace que sea invisible para el vinculador una vez que la unidad de traducción actual se compila en un archivo objeto.

En otras palabras, solo tiene un enlace interno dentro de la unidad de traducción actual. Cuando no se usa static o se usa explícitamente el especificador de clase de almacenamiento extern, el símbolo tiene un enlace externo.

2

de la norma C99:

6.2.2 Vínculos de los identificadores

Si la declaración de un fi le alcance identi fi er para un objeto o una función contiene la clase de almacenamiento específico er fi estático, el identi fi cador tiene un enlace interno.

y

En el conjunto de unidades de traducción y bibliotecas que constituye todo un programa, cada declaración de un particular, er fi cación con enlace externo denota el mismo objeto o función. Dentro de una unidad de traducción, cada declaración de un identificador con un enlace interno denota el mismo objeto o función. Cada declaración de un identificador sin enlace denota una entidad única.

Cuestiones relacionadas