Límites del identificador C
-
21-08-2019 - |
Pregunta
¿Cómo llamar a un símbolo con nombre destrozado desde C?
module.name:version
void* function(TypeSig); // Type of the function
Me gustaría poder utilizar rutas de código escritas en mi idioma en C.La convención de llamada a funciones es aproximadamente la misma.Es solo que debo alterar la versión y la ruta del módulo dentro de los símbolos que exporto, y tengo la misma convención de identificador que C, por lo tanto, no puedo usar guión bajo.
Solución
IIUC, está definiendo su propio lenguaje y está buscando un algoritmo de manipulación de nombres adecuado.
Es posible que desee utilizar Intel et.al. Algoritmo de alteración de nombres de Itanium, que g++ utiliza en todas las plataformas.Para el caso específico, puede alterar cada uno de sus nombres como si la declaración de C++ fuera
namespace module{ namespace name { namespace Vversion /*e.g. V1_0 */ {
void *function(int){}
}}}
que destrozaría como
_ZN6module4name4V1_08functionEi
Como todos sus símbolos usan ese algoritmo, no pueden entrar en conflicto entre sí.Tampoco pueden entrar en conflicto con una función estándar de C llamada _ZN6module4name4V1_08functionEi
, ya que todos los nombres que comienzan con _Z (o _MAYÚSCULAS) están reservados para la implementación (de C).Si desea una capacidad de llamada conveniente desde g++, puede usar esta convención exacta;de lo contrario, elige una letra diferente de la Z.