/ / L'uso di #define con lo stesso identificatore in molte classi porta a "errore: <ID> ridefinito" - c ++, logging, android-ndk, include, header-files

L'uso di #define con lo stesso identificatore in molte classi porta a "errore: <ID> ridefinito" - c ++, logging, android-ndk, include, header-files

Sto usando una classe helper per registrare i messaggi in Android ndk in modo semplice. Funziona così:

LOGE("ClassTag", "Message");

Dal momento che non voglio scrivere il tag manualmente ogni volta che voglio registrare qualcosa, definisco una costante TAG per ogni definizione di classe:

#define  TAG    "Class1Tag"

E poi posso solo accedere facendo:

LOGE(TAG, "Message");

Il problema si presenta quando una classe con la costante TAG definita include un'altra classe che ha la stessa costante TAG dichiarata. Quindi viene visualizzato il seguente errore di compilazione:

error: "TAG" redefined

Come posso eliminare le ridefinizioni senza dover utilizzare un identificatore diverso per ogni #define?

risposte:

2 per risposta № 1

Sembra che tu stia definendo il valore del TAGil file di intestazione. Affinché questo tipo di cose funzioni correttamente, è necessario definirlo solo nel file di implementazione. Poiché il file di implementazione non è incluso negli altri file, non ci sarà ridefinizione.

Una delle implicazioni di ciò è che le istruzioni di registrazione possono verificarsi solo nel file di implementazione.


1 per risposta № 2

Definirli nei rispettivi file .cpp anziché nelle intestazioni.

O usa un privato, statico, const std::string o matrice di char, che ti consente di utilizzare le dichiarazioni di registrazione nell'intestazione mentre sono invisibili ad altre classi.


1 per risposta № 3

Se si definisce lo stesso identificatore in diversi file di intestazione, non è probabile che si ottenga il comportamento desiderato. In un determinato file di implementazione, il valore per l'identificatore sarà l'ultimo definito, non necessariamente quello associato alla classe. L '"ultimo definito" sarà quello nell'ultimo file di intestazione incluso nel file di implementazione, ad es.

a.h:

#define TAG "ClassA"

b.h:

#define TAG "ClassB"

a.cpp:

#include "a.h"
#include "b.h"

Per questo esempio, gli usi di TAG in a.cpp avranno il valore "ClassB".

Fondamentalmente, non vuoi mai ridefinire gli identificatori nel tuo intestazione File. Se si definisce un identificatore in un implementazione file che è uguale a uno in un altro implementazione file, che può funzionare perché non sarà visibiledurante la compilazione degli altri file di implementazione. Ma il compilatore si lamenta per una ragione, e dovresti prestare attenzione a ciò che ti sta dicendo per evitare confusione.

EDIT: So che il tuo compilatore lo segnala come un errore; il risultato di ciò che ho detto non è di rilassare le lamentele del compilatore per accettare ciò che si ha, perché ciò probabilmente causerà confusione.


0 per risposta № 4

perché non usare #under TAG prima #define TAG "ClassTag"