Existe la posibilidad de que la función estática se pueda evaluar fuera del alcance del archivo. ?Acceso a la función estática en otros archivos
Respuesta
Depende de lo que quiere decir con "acceso". Por supuesto, la función no puede llamarse por nombre en ningún otro archivo, ya que es static
en un archivo diferente, pero tiene un puntero a la función.
$ cat f1.c
/* static */
static int number(void)
{
return 42;
}
/* "global" pointer */
int (*pf)(void);
void initialize(void)
{
pf = number;
}
$ cat f2.c
#include <stdio.h>
extern int (*pf)(void);
extern void initialize(void);
int main(void)
{
initialize();
printf("%d\n", pf());
return 0;
}
$ gcc -ansi -pedantic -W -Wall f1.c f2.c
$ ./a.out
42
No, a menos que haya un error en el compilador. Normalmente, el código de función estática no está etiquetado con un nombre utilizado para exportar la función en el archivo de objeto, por lo que no se presenta al vinculador y simplemente no se puede vincular a él.
Por supuesto, esto solo se aplica a llamar a la función por su nombre. Otro código dentro del mismo archivo puede obtener la dirección de la función y pasarla a una función no estática en otro archivo y luego la función de otro archivo puede llamar a su función estática.
Siguiendo el estándar, no se puede acceder a una función estática fuera del alcance del archivo por el nombre porque está sujeto a un enlace interno. Su nombre no se exporta ni se proporciona al vinculador. Sin embargo, todavía puede ser accedido y llamado por el puntero de función, como cualquier otra función.
Se podría invocar desde fuera del alcance mediante el puntero de función.
Por ejemplo, si usted tenía:
static int transform(int x)
{
return x * 2;
}
typedef int (*FUNC_PTR)(int);
FUNC_PTR get_pointer(void)
{
return transform;
}
entonces una función fuera del alcance puede llamar get_pointer() y utilizar el puntero de función vuelto a llamar a transformar.
Creo que debería ser "int (* get_pointer (int)) (void)". – paxdiablo
@paxdiablo y @caf - gracias. –
No, el objetivo de la palabra clave static es limitar el alcance del nombre de la función al archivo.
No se puede acceder fuera de un archivo por su nombre. Pero también puedes asignarlo al puntero de función y usarlo donde quieras.
Solo con engaño. La función generalmente no es visible para el enlazador, por lo que no le permitirá hacerlo.
Pero, si se proporciona una función dentro de la misma unidad de compilación (como la función estática), que devuelve la dirección de esa función:
En main.c
:
#inclde <stdio.h>
int (*getGet7(void))(void);
int main (void) {
int (*fn)(void) = getGet7();
printf ("Result is: %d\n", fn());
return 0;
}
En hidden.c
:
static int get7 (void) {
return 7;
}
int (*getGet7(void)) (void) {
return get7;
}
Esto dará como resultado que se llame a la función estática get7
.
pax> gcc -o demo main.c hidden.c ; ./demo
Result is: 7
"Accessed"? Depende de lo que quieras decir con este término. Supongo que cuando dices "función estática" estás hablando de la función independiente declarada static
(declarada con enlace interno) en oposición a las funciones de miembro de clase estáticas en C++, ya que estas últimas son obvias y de fácil acceso desde cualquier lugar.
Ahora, una función autónoma declarada static
tiene un enlace interno. No puede ser vinculado a desde cualquier otra unidad de traducción.O, en otras palabras, no se puede hacer referencia al por el nombre desde cualquier otra unidad de traducción. Si eso es lo que quiso decir con "acceso desde fuera del alcance del archivo", entonces no, no se puede hacer.
Sin embargo, si las otras unidades de traducción de alguna manera obtienen un puntero a esa función (es decir, si de alguna manera permite que el puntero "se filtre" en el mundo exterior), cualquiera puede invocar esa función realizando una llamada "acceder a él. Por ejemplo, si se declara
static void foo_static(void) {
}
extern void (*foo_ptr)(void) = foo_static;
entonces en cualquier otra unidad de traducción que el usuario será capaz de hacer
extern void (*foo_ptr)(void);
foo_ptr();
y la llamada se vaya a su función foo_static
. No sé si ese tipo de acceso califica como "acceso" en su pregunta.
- 1. función no estática frente a función estática y variable
- 2. Acceso variable privada de la función estática en php
- 3. llamada ambigua a la función estática sobrecargada
- 4. C++ miembro función de acceso privado variable estática?
- 5. Una alternativa a la anotación @Value en la función estática
- 6. Establecer la regla de acceso a archivos
- 7. ¿Sobrecarga de la función estática?
- 8. variable estática global vs variable estática en la función?
- 9. Variable estática en función establecida llamando a otra función
- 10. ¿Capa de acceso a datos estática o basada en instancia?
- 11. Posible inicializar la variable estática llamando a la función
- 12. Vinculación a otros archivos de jade
- 13. Rake tareas en otros archivos
- 14. LoadControl en función estática/compartida
- 15. ¿Cómo hago referencia a funciones en otros archivos con leiningen?
- 16. Acceso a archivos grandes En C
- 17. Acceso a varios archivos en VIM
- 18. Problema con consulta SQL cuando se llama a una función estática de otra función estática en la misma clase
- 19. simultánea de acceso a archivos
- 20. Acceso a archivos de fuentes en PDF
- 21. Función estática Ayuda C++
- 22. php función estática
- 23. Declarar una función estática y luego no estática: ¿es estándar?
- 24. Función recursiva con la variable estática
- 25. Acceso a la función de vibración en Windows 8 WinRT?
- 26. Velocidad de acceso de archivos frente a la velocidad de acceso a la base de datos
- 27. extern en una función estática en C++
- 28. Concurrencia de función estática ASP.NET
- 29. acceso variable estática del método estático
- 30. ¿Se puede llamar a una función estática a través de un puntero de función en C?
Si coloca la función en el archivo de encabezado. Luego habrá una versión estática en cada unidad de compilación. –