2010-02-17 10 views
17

compilación con gcc 4.4.2 y WinXP Visual Studio C++ 2008multiplataforma definir #define para macros __FUNCTION__ y __func__

#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 usar plataforma cruzada y usar el mismo func al compilar en Linux o Windows.

Sin embargo, cuando estoy recopilando en WinXP me sale el siguiente error:

__func__ undeclared identifier 

¿Puedo no #define una macro como esta?

Muchas gracias por todas las sugerencias,

+3

Debe usar #if defined (_MSC_VER) en lugar de #if defined (_WIN32). La pregunta no es qué sistema operativo estás usando. La pregunta es qué compilador estás usando. –

Respuesta

24

Parece que usted tiene su #define hacia atrás. Si desea utilizar __func__ en ambas plataformas, y Win32 tiene __FUNCTION__ pero no __func__, lo que necesita hacer esto en su lugar:

#if defined (WIN32) 
#define __func__ __FUNCTION__ 
#endif 

Puede haber una mejor manera de saber si es necesario definir __func__ o no, pero este truco rápido debería hacer el truco.

Recuerde, en compiladores que soportan los __FUNCTION__ y __func__ palabras clave, no son macros por lo que no puede hacer lo siguiente (ya que #ifndef __func__ no es válida):

#ifndef __func__ 
#define __func__ __FUNCTION__ 
#endif 

De la especificación C99:

6.4.2.2 Predefined identifiers

1 The identifier __func__ shall be implicitly declared by the translator as if, immediately following the opening brace of each function definition, the declaration

static const char __func__[] = "function-name"; 

appeared, where function-name is the name of the lexically-enclosing function.

+0

Gracias que funcionó. Pero me hizo pensar. Cuando dices que __FUNCTION__ y __func__ no son macros. ¿Por qué no puedes definirlo en un #define? Además, ¿cómo podemos saber si se trata de una macro o palabra clave? Muchas gracias. – ant2009

+1

Esa es una buena pregunta: supongo que debe consultar las especificaciones de ANSI (o Google) para averiguarlo. En este caso, '__func__' es un" identificador predefinido "y, en función de la descripción, actúa como una variable estática const definida en la función. En mi ejemplo anterior, la parte que no funcionará es '#ifndef __func__' ya que' __func__' no es una macro definida visible para el preprocesador de macros. – tomlogic

1

Puede, por supuesto #define una macro tales. Cada instancia de FUNCTION se reemplaza por __func__. Sin embargo, obviosuly su compilador no sabe __func__. Creo VC sabe __FUNCTION__, por lo

#if defined (WIN32) 
# define __func__ __FUNCTION__ 
#endif 

podría hacer.

+0

Lo siento, pero eso tampoco funcionó. Gracias. – ant2009

+0

'__FUNCTION__' no es una macro, por lo que no puede tener un #ifdef en ella. Al igual que con '__func__', es una palabra clave para el compilador o no lo es. – tomlogic

+0

@tomlogic: Sí, tienes razón. Lo arreglé. – sbi

2

Debería poder usar __func__ sin macros explícitas en ningún compilador que admita C99.

+1

Sí, puedo usar eso en c89/c99. Sin embargo, visual studio 2008 usa __FUNCTION__. Estaba intentando #define para poder usar la misma macro para windows y linux. Gracias. – ant2009

6

La macro __FUNCTION__ está predefinida en el compilador MSVC. Tendrá que hacer que se vea como esto:

#ifndef _MSC_VER 
#define __FUNCTION__ __func__ 
#endif 

O a la inversa, si se prefiere:

#ifdef _MSC_VER 
#define __func__ __FUNCTION__ 
#endif 
+0

Intenté eso, y todavía tengo el mismo error. También probé esto en la condición (__MSVC__) y obtuve el mismo error.Cualquier otra sugerencia Gracias. – ant2009

+0

Tal vez soy yo, pero cuando pruebo esos 2 me sale el error: "# si [n] def esperaba un identificador". Gracias. – ant2009

+0

@robUK - oops, el fragmento original me metió en problemas. Fijo. –

Cuestiones relacionadas