clases - que es un objeto en c#
Multiplataforma definiendo#define para macros__FUNCTION__ y__func__ (4)
Debería poder usar __func__
sin ninguna macros explícita en ningún compilador que admita C99.
Compilación con gcc 4.4.2 y WinXP Visual Studio C ++ 2008
#if defined ( WIN32 )
#define __FUNCTION__ __func__
#endif
Como quiero usar la macro para mostrar el nombre de la función. He hecho lo anterior para poder realizar una plataforma cruzada y usar la misma función al compilar en Linux o Windows.
Sin embargo, cuando estoy compilando en WinXP me sale el siguiente error:
__func__ undeclared identifier
¿No puedo # definir una macro como esta?
Muchas gracias por las sugerencias,
La macro __FUNCTION__
está predefinida en el compilador MSVC. Tendrás que hacer que se vea así:
#ifndef _MSC_VER
#define __FUNCTION__ __func__
#endif
O al revés, si lo prefiere:
#ifdef _MSC_VER
#define __func__ __FUNCTION__
#endif
Parece que tienes tu #define
hacia atrás. Si desea usar __func__
en ambas plataformas, y WIN32 tiene __FUNCTION__
pero no __func__
, debe hacer esto en su lugar:
#if defined ( WIN32 )
#define __func__ __FUNCTION__
#endif
Puede haber una mejor manera de saber si necesita definir __func__
o no, pero este truco rápido debería hacer el truco.
Recuerde, en los compiladores que admiten las palabras clave __FUNCTION__
y __func__
, no son macros, por lo que no puede hacer lo siguiente (ya que #ifndef __func__
no es válido):
#ifndef __func__
#define __func__ __FUNCTION__
#endif
De la especificación C99:
6.4.2.2 Identificadores predefinidos
1 El identificador
__func__
será declarado implícitamente por el traductor como si, inmediatamente después de la llave de apertura de cada definición de función, la declaración
static const char __func__[] = "function-name";
apareció, donde nombre-función es el nombre de la función que encierra léxicamente.
Por supuesto, puede #define
esta macro. Cada instancia de FUNCTION
es reemplazada por __func__
. Sin embargo, obviamente su compilador no sabe __func__
. Creo que VC sabe __FUNCTION__
, entonces
#if defined ( WIN32 )
# define __func__ __FUNCTION__
#endif
podría hacer.