2010-11-12 21 views
6

...../PluginLoader.h:34: multiple definition of 'Dummy_Func_For_Generating_FUNCTION_NAME_Macro()'¿Cómo verificar si __PRETTY_FUNCTION__ se puede usar?

El error anterior se muestra para el siguiente código. He incluido guardias en mi archivo. Y todo lo demás compila bien.

EDITAR: Lo que estaba tratando de lograr era comprobar si __PRETTY_FUNCTION__ se definió, y si lo era, usarlo más tarde en el código a través de FUNCTION_NAME macro (Para fines de registro). Si __PRETTY_FUNCTION__ no está definido, use la siguiente mejor opción y así sucesivamente. Sin embargo, las respuestas que obtuve me hicieron darme cuenta de que esto era imposible. Entonces, si __PRETTY_FUNCTION__ y todos estos otros no son macros, ¿qué son? ¿Y cómo puedo verificar si una determinada implementación tiene uno de ellos o no?

void Dummy_Func_For_Generating_FUNCTION_NAME_Macro() 
    { 
#ifndef FUNCTION_NAME 
    #ifdef __PRETTY_FUNCTION__ 
     #define FUNCTION_NAME __PRETTY_FUNCTION__ 
    #elif __FUNCTION__ 
     #define FUNCTION_NAME __FUNCTION__ 
    #elif __func__ 
     #define FUNCTION_NAME __func__ 
    #else 
     #define FUNCTION_NAME "" 
    #endif 
#endif 
    } 
+0

¿Cuál es el valor de '__PRETTY_FUNCTION__',' __FUNCTION__' y '__func__'? –

+0

@Adrien: estas son macros predefinidas, pero no todas están implementadas para todos los compiladores. –

+1

¿Hiciste esta función en un encabezado? Si el encabezado se incluye varias veces, el compilador puede quejarse de que encuentra la misma función más de una vez. – Patrick

Respuesta

13

void Dummy_Func_For_Generating_FUNCTION_NAME_Macro() es una función, no es una macro. Las funciones no crean macros. Las macros se resuelven en la fase de preprocesador y funcionan en fase de compilación. Elimine la definición de función, y deje solo el bloque #ifndef.

Utilice las macros de identificación del compilador para determinar qué macro de identificación de función usar. Por ejemplo:

#ifdef _MSC_VER // Visual Studio 
    #define FUNCTION_NAME __FUNCTION__ 
#endif 
+0

Pero '__PRETTY_FUNCTION__',' __FUNCTION__' y '__func__' solo se definen siempre * dentro de una función *! –

+0

@Paul R, la macrodefinición no debe tener ámbito –

+0

Use' FUNCTION_NAME' en una función que usted ' En realidad, estoy interesado en, y no en la función ficticia, donde siempre se resolverá el maniquí. – Dialecticus

5

__PRETTY_FUNCTION__ y __FUNCTION__ no son macros del preprocesador como __LINE__ o __FILE__, pero constantes mágicas que no están disponibles en el momento preprocesador, pero más tarde en tiempo de compilación (en el ámbito de la función).

Así que lo que sea que intente hacer con las macros aquí probablemente no funcione de todos modos.

Sin embargo, el error de compilación probablemente sea un problema con la protección. Tengo éxito compilando un programa no muy diferente (ver a continuación) sin ningún problema. Pero como dije antes, FUNCTION_NAME siempre se configurará como cadena vacía.

archivo de cabecera xx.h

#ifndef H_XX_H 
#define H_XX_H 

#ifndef FUNCTION_NAME 
    void Dummy_Func_For_Generating_FUNCTION_NAME_Macro() 
    { 
    #ifdef __PRETTY_FUNCTION__ 
     #define FUNCTION_NAME __PRETTY_FUNCTION__ 
    #elif __FUNCTION__ 
     #define FUNCTION_NAME __FUNCTION__ 
    #elif __func__ 
     #define FUNCTION_NAME __func__ 
    #else 
     #define FUNCTION_NAME "" 
    #endif 
    ; 
    } 
#endif 
#endif 

archivo de origen xx.c

#include <stdio.h> 
#include "xx.h" 

main(){ 
    printf("%s\n", FUNCTION_NAME); 
} 
+0

'__GUARD' [está reservado] (http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-un-underscore-in-a-c-identifier), no lo use. – GManNickG

+0

Bien, supongo que no está reaccionando con la palabra clave '__guard', sino con el guión bajo doble. – kriss

+0

+1, está en lo correcto señor – nakiya

0

Solía ​​conocido a este problema, que es causada por el disco montado:

subst R : C: \ Source \

Test.cpp:

#include "C:\Source\PluginLoader.h" 
#include "R:\PluginLoader.h" 

Ahora si incluye protector es #pragma vez, el compilador no es lo suficientemente inteligente para saber que son reales de un archivo, por lo tanto provocar el error redefinición.

Sin embargo, no estoy seguro de si este es su problema, ya que depende de:

  • Usted incluye tanto de disco virtual, y el disco físico
  • Tu incluyen guardia es #pragma una vez, no se la macroprotección

.

0

Ponga su función en anonymous namespace. Eso eliminará la definición duplicate functionerrors. Es decir.

namespace { 
    function goes here 
    } 
Cuestiones relacionadas