2010-11-12 12 views
6

...../PluginLoader.h:34: multiple definition of 'Dummy_Func_For_Generating_FUNCTION_NAME_Macro()'Come verificare se __PRETTY_FUNCTION__ può essere utilizzato?

L'errore sopra riportato viene emesso per il codice riportato di seguito. Ho incluso delle guardie nel mio file. E tutto il resto va bene.

EDIT: Quello che stavo cercando di raggiungere è stato quello di verificare se __PRETTY_FUNCTION__ è stato definito, e se fosse, usarlo più avanti nel codice tramite FUNCTION_NAME macro (per scopi di registrazione). Se __PRETTY_FUNCTION__ non è definito, utilizzare la cosa migliore successiva e così via. Tuttavia, le risposte che ho ottenuto mi hanno fatto capire che questo è impossibile. Quindi, se __PRETTY_FUNCTION__ e tutti questi altri non sono macro, quali sono? E come posso verificare se una determinata implementazione ne ha una o meno?

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

qual è il valore di '__PRETTY_FUNCTION__',' __FUNCTION__' e '__func__'? –

+0

@Adrien: sono macro predefinite, ma non tutte sono implementate per tutti i compilatori. –

+1

Hai inserito questa funzione in un'intestazione? Se l'intestazione è inclusa più volte, il compilatore potrebbe lamentarsi di trovare la stessa funzione più di una volta. – Patrick

risposta

13

void Dummy_Func_For_Generating_FUNCTION_NAME_Macro() è una funzione, non una macro. Le funzioni non creano macro. Le macro vengono risolte nella fase del preprocessore e funzionano nella fase del compilatore. Rimuovere la definizione della funzione, e lasciare solo il blocco #ifndef.

Utilizzare le macro di identificazione del compilatore per determinare quale funzione identifica la macro da utilizzare. Per esempio:

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

Tuttavia, '__PRETTY_FUNCTION__',' __FUNCTION__' e '__func__' sono sempre definiti * solo all'interno di una funzione *! –

+0

@Paul R, la definizione di macro non dovrebbe avere scope –

+0

Usa' FUNCTION_NAME' in una funzione che tu ' in realtà interessato a, e non nella funzione dummy, dove si risolverà sempre in dummy – Dialecticus

5

__PRETTY_FUNCTION__ e __FUNCTION__ non sono le macro del preprocessore come __LINE__ o __FILE__, ma costanti magici che non sono disponibili al momento del preprocessore, ma più tardi al momento della compilazione (in ambito delle funzioni).

Quindi qualsiasi cosa tu stia cercando di fare con i macro qui probabilmente non funzionerà comunque.

Tuttavia, l'errore di compilazione è probabilmente un problema con la protezione. Sono riuscito a compilare un programma non molto diverso (vedi sotto) senza alcun problema. Ma come detto sopra, FUNCTION_NAME sarà sempre impostato sulla stringa vuota.

file di intestazione 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 

sorgente xx.c

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

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

'__GUARD' [è riservato] (http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier), non usarlo. – GManNickG

+0

OK, suppongo che tu non stia reagendo sulla parola chiave '__guard' ma sul doppio trattino principale. – kriss

+0

+1, sei corretto signore – nakiya

0

Ho usato incontrato questo problema, che è causato da disco montato:

subst R : C: \ Source \

Test.cpp:

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

Ora, se si include guardia è #pragma una volta, il compilatore non è abbastanza intelligente per sapere che sono effettivamente un file, quindi causare l'errore di ridefinizione.

Tuttavia, non sono sicuro se questo è il tuo problema, in quanto dipende da:

  • Si include sia da disco virtuale, e disco fisico
  • tuo includono guardia è #pragma una volta, non la macro guardia

.

0

Inserire la propria funzione in un anonymous namespace. Ciò eliminerà la definizione duplicate functionerrors. Cioè

namespace { 
    function goes here 
    } 
Problemi correlati