Designación de tipos en los compiladores
§1 Sinopsis
El operador typeid permite obtener en tiempo de ejecución (runtime), el tipo de objetos y expresiones (en la explicación que sigue, las denominamos "entidades"). Es útil para comprobar el tipo de un objeto y si dos objetos son del mismo tipo. En el caso de un objeto obj, su tipo puede obtenerse mediante la sentencia:
cout << typeid(obj).name() << endl;
La descripción de cada uno de los infinitos tipos de objetos (primitivos, o
definidos por el usuario), no está estandarizada, por lo que cada fabricante
utiliza una simbología especial. Sin embargo, tras un examen atento de
algunos ejemplos no es difícil descubrir sus reglas de construcción.
La tabla muestra el resultado de la sentencia anterior con cada uno de los compiladores indicados con 7 entidades distintas, así como las declaraciones utilizadas en cada caso.
N |
Declaración de la entidad entj |
Borland C++ 5.5 |
GNU C++ |
MS Visual C++ 6.0 |
1 | int* (*ent) (int); |
int * (*)(int) |
PFi_Pi |
int * (__cdecl*)(int) |
2 | int* ent(int); |
int * (*)(int) |
Fi_Pi |
int * (__cdecl*)(int) |
3 | int ent(int); |
int (*)(int) |
Fi_i |
int (__cdecl*)(int) |
4 | int (*ent) (int); |
int (*)(int) |
PFi_i |
int (__cdecl*)(int) |
5 | void ent(int *fu(int)); |
void (*)(int * (*)(int)) |
FPFi_Pi_v |
void (__cdecl*)(int * (__cdecl*)(int)) |
6 | void ent(int (*p)(int)) |
void (*)(int (*)(int)) |
FPFi_i_v |
void (__cdecl*)(int (__cdecl*)(int)) |
7 | void foo(int *ent(int)); |
int * (*)(int) |
PFi_Pi |
int * (__cdecl*)(int) |
Es importante resaltar aquí, que la entidad 7 (argumento de la función foo), es tratado por los tres
compiladores como un puntero-a-función del mismo tipo (objeto 1).