2012-07-23 6 views
8

Capisco che una funzione statica in C permette quella particolare funzione da chiamare solo entro i confini di quel file. Quello che mi interessa è come ciò avvenga. Viene inserito in una parte specifica della memoria o il compilatore applica una specifica operazione a quella funzione. Questo stesso processo può essere applicato a una chiamata di funzione in assembly?In che modo C limita l'utilizzo di una funzione statica solo al suo file?

risposta

11

Non ha nella tabella il nome dell'oggetto, che gli impedisce di essere collegato in altre cose.

6

Funzioni e altri nomi vengono esportati come simboli nel file oggetto. Il linker utilizza questi simboli per risolvere tutti i tipi di riferimenti pendenti al momento del collegamento (ad esempio una chiamata a una funzione definita in un altro file). Quando lo si dichiara static, semplicemente non verrà esportato come simbolo. Pertanto non verrà raccolto da nessun altro file. Potresti comunque chiamarlo da un altro file se avevi un puntatore a funzione.

2

E 'infatti l'opposto. Quando una funzione è non statica, il suo nome è scritto da qualche parte nel file oggetto, che il linker può quindi utilizzare per collegare altri file oggetto utilizzando questa funzione, l'indirizzo di quella funzione.

Quando la funzione è dichiarata static, il compilatore semplicemente non mettere il nome.

12

La dichiarazione di una funzione static non impedisce effettivamente che sia chiamato da altre unità di traduzione.

Nei static fa è che impedisce la funzione di essere cui (collegate) da altre unità di traduzione per nome. Che eliminerà la possibilità di diretti chiamate a quella funzione, cioè chiama "per nome". Per ottenere ciò, il compilatore esclude semplicemente il nome della funzione dalla tabella dei nomi esterni esportati dall'unità di traduzione. Oltre a questo, non c'è assolutamente niente di speciale riguardo alle funzioni statiche.

È ancora possibile chiamare da altre unità di traduzione con altri mezzi. Ad esempio, se in qualche modo hai ottenuto un puntatore alla funzione static in un'altra unità di traduzione, puoi chiamarlo tramite quel puntatore.

Problemi correlati