2012-07-23 8 views
8

Entiendo que una función estática en C permite que esa función particular solo se llame dentro de los límites de ese archivo. Lo que me interesa es cómo ocurre esto. ¿Se está colocando en una parte específica de la memoria o es el compilador que aplica una operación específica a esa función? ¿Se puede aplicar este mismo proceso a una llamada de función en el ensamblaje?¿Cómo C limita el uso de una función estática solo a su archivo?

Respuesta

11

No entra en la tabla de nombres del objeto que impide que se vincule con otras cosas.

6

Las funciones y otros nombres se exportan como símbolos en el archivo objeto. El vinculador usa estos símbolos para resolver todo tipo de referencias pendientes en el tiempo del enlace (por ejemplo, una llamada a una función definida en otro archivo). Cuando lo declaras static, simplemente no se exportará como un símbolo. Por lo tanto, no será recogido por ningún otro archivo. Aún podría llamarlo desde otro archivo si tuviera un puntero a la función.

2

De hecho, es lo contrario. Cuando una función es no estática, su nombre está escrito en algún lugar del archivo objeto, que luego el enlazador puede usar para vincular otros archivos de objetos usando esta función, a la dirección de esa función.

Cuando la función se declara static, el compilador simplemente no pone el nombre allí.

12

Declarar una función static realmente no impide que sea llamado de otras unidades de traducción.

Lo static hace es que previene la función de ser referidos (vinculados) de otras unidades de traducción por su nombre. Esto eliminará la posibilidad de llamadas directas a esa función, es decir, llamadas "por nombre". Para lograr eso, el compilador simplemente excluye el nombre de la función de la tabla de nombres externos exportados desde la unidad de traducción. Aparte de eso, no hay absolutamente nada especial acerca de las funciones estáticas.

Aún puede llamar al que funciona desde otras unidades de traducción por otros medios. Por ejemplo, si de alguna manera obtuvo un puntero a la función static en otra unidad de traducción, puede llamarlo a través de ese puntero.

Cuestiones relacionadas