Ich kompiliere Legacy-Code mit 4.3.3 und verwende im Moment -Werror
. Aus irgendeinem Grund, obwohl eine Variable in einem Makro gelesen wird, denkt gcc
, dass es nicht verwendet wird - ich verstehe nicht warum.GCC4.3.3: Variable in einem Makro verwendet als unbenutzt markiert
Hier werden die Schnipsel sind:
void MyClass::processEvent()
{
i32 event = getEvent();
i32 handle = getHandle();
DEBUG_ENTRY(__OBSV_KEY__, __LINE__,
"MyClass::processEvent() event=%d", event,
" (handle=%d)", handle);
}
Die Debug-Eintrag Makro (nur entry2 in aktuellen Code verwendet wird, der Eintritt ist legacy):
#define DEBUG_ENTRY(MOD, NR, STR1, DAT1, STR2, DAT2) \
ENTRY(MOD,NR,DAT1,DAT2) \
ENTRY2(MOD, NR, STR1, DAT1, STR2, DAT2)
Eintrag Makrocode (auf relevante Funktionsaufruf gestrippt only):
#define ENTRY2(MOD, NR, STR1, DAT1, STR2, DAT2) \
{ \
Observer::setEntry((int) DAT1, (int) DAT2); \
}
Und schließlich die Funktion selbst:
int Observer::setEntry (int a_nInt1, int a_nInt2)
{
// relevant part only: member variables set to a_nInt1 and a_nInt2
p_NewEntry->m_nInt1 = a_nInt1;
p_NewEntry->m_nInt2 = a_nInt2;
return ERR_NONE;
}
So zusammenzufassen, beide event
und handle
sind die Makro-Kette an die eigentliche Funktion weitergegeben, wo ihren Wert durch das Speichern der Werte dieses Objekts Membervariablen lesen ist.
Warum denkt der GCC, dass event
und handle
nicht verwendet werden, wenn das Makro verwendet wird? Wenn ich das Makro vermeide und stattdessen denselben Code einfüge, wird die Warnung nicht ausgegeben. Kann ich das Licht irgendwie sehen, ohne auf das Makro UNUSED
zurückgreifen zu müssen, um die Warnung zum Schweigen zu bringen?
Können Sie eine [MCVE] angeben, die die Warnung reproduziert. –
Sie würden nicht zufällig zwei alternative Definitionen von einem oder mehreren dieser Makros haben, und eines davon erweitert sich zu nichts? – molbdnilo
@molbdnilo - wenn er '-Werror' verwendet, sollte er einen Fehler für das neu definierte Makro bekommen (oder sonst nur eine Warnung) ... ohne das ganze Beispiel raten wir nur: ( –