switch que objeto clases c visual-studio macros

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.