Foro con Clase C/C++
Acceder a una función estatica desde otro modulo en el que no es
Manu Exposito
Nº de hilos:6
Nº de mensajes:14
lunes, 3 de mayo de 2021
Buenos días Salvador...
Te pongo en unos aprietos que vaya tela, jajaja
Verás tengo el fuente de un programa en C que no puedo tocar. En ese funete se define y se implemeta varias funciones estaticas que necesito usar en mi programa. Las funciones estáticas están en una LIB hecha a partir de esos fuentes que tengo pero no puedo tocar...
Hay alguna posibilidad de que las pueda usar?
Gracias Salvador
Salvador Pozo
Nº de hilos:0
Nº de mensajes:25
martes, 4 de mayo de 2021
Hola:
En principio no debería ser complicado usar funciones de una librería estática.
Esa librería estará compilada, y dependiendo del compilador tendrá un nombre de fichero con extensión .a, .o ó .lib.
También tendrás acceso al fichero de cabecera con las declaraciones de la funciones públicas de esa librería, con extensión .h.
Para poder usar las funciones de una librería bastará con incluir en tu programa fuenta el fichero de cabecera, e indicar al enlazador (linker) que enlace el fichero objeto de tu programa con el fichero de librería.
Si estás usando un IDE como Code::Blocks, esto se hace en las opciones de construcción (build options), y en la pestaña "linker settings".
También se pueden especificar las librerías mediante un fichero "make".
Cuando creamos aplicaciones de Windows, por ejemplo, se han de enlazar las librerías estáticas que permiten acceder al API. En este caso, aunque las librerías sean de enlace dinámico (DLL), las llamadas se hacen a través de una librería estática. En esa librería está el código para cargar e invocar a la funciones que hay en la DLL, pero sigue siendo necesario enlazar la librería estática que actúa como "puente" entre nuestro programa y la DLL.
Hasta pronto.
Manu Exposito
Nº de hilos:6
Nº de mensajes:14
martes, 4 de mayo de 2021
Creo que no me he explicado bien :(
Quiero decir que tengo una serie de funciones que estan declaradas como static:
static void func1( void );
static void func2( void );
Esas funciones están en un modulo1.c del programa que no puedo cambiar...
Sin embargo necesito usar esas funciones en otro modulo2.c...
Dispongo del codigo fuente del modulo1.c pero no puedo cambiarlo...
Salvador Pozo
Nº de hilos:0
Nº de mensajes:25
miércoles, 5 de mayo de 2021
Hola:
Precisamente, la intención de usar static en la declaración de una función es que sea inaccesible desde otros ficheros fuente. Así que, en principio, no deberías poder usar esas funciones.
A mi modo de ver tienes dos opciones:
1.- Copiar esas funciones a tu propio código en modulo2.c. Ya que tienes acceso al código fuente, esto no debería ser muy difícil.
2.- Incluir el ficbero fuente "modulo1.c" en tu código. Es otra manera de hacer lo mismo, aunque puede que resulte demasiado redundante.
----8<------
// modulo1.c:
// Fichero fuente intocable con funciones estáticas
#include <iostream>
static void func1( void );
static void func2( void );
void func1( void ) {
std::cout << "Hola, soy la función 1" << std::endl;
}
void func2( void ) {
std::cout << "Hola, soy la función 2" << std::endl;
}
----8<------
----8<------
// modulo2.c:
#include <iostream> #include "modulo1.c" int main() { func1(); func2(); return 0; }
----8<------
En general no me gusta usar la directiva include con ficheros que no sean de cabecera, es una mala práctica.
Hasta pronto.
Manu Exposito
Nº de hilos:6
Nº de mensajes:14
miércoles, 5 de mayo de 2021
No me gusta ninguna de las dos ya que no soy dueño de esos módulos y pueden se rvariados en cualquier momento y entonces puede que mis fuentes no estén actualizados.
Yo iba más por acceder a la tabla de símbolos o algo así...
Si no puede ser no puede ser y ya está!!!