На чисто практическом уровне я имею дело с этим ежедневно.Наилучшим решением на сегодняшний день является использование препроцессора.Мой общий заголовочный файл содержит:
//-------------------------------------------------------------------------
// Suppress nuisance compiler warnings. Yes, each compiler can already
// do this, each differently! VC9 has its UNREFERENCED_PARAMETER(),
// which is almost the same as the SUPPRESS_UNUSED_WARNING() below.
//
// We append _UNUSED to the variable name, because the dumb gcc compiler
// doesn't bother to tell you if you erroneously _use_ something flagged
// with __attribute__((unused)). So we are forced to *mangle* the name.
//-------------------------------------------------------------------------
#if defined(__cplusplus)
#define UNUSED(x) // = nothing
#elif defined(__GNUC__)
#define UNUSED(x) x##_UNUSED __attribute__((unused))
#else
#define UNUSED(x) x##_UNUSED
#endif
Пример использования UNUSED:
void foo(int UNUSED(bar)) {}
Иногда вам действительно нужно обратиться к параметру, например, в assert ()или отладочный оператор.Вы можете сделать это с помощью:
#define USED_UNUSED(x) x##_UNUSED // for assert(), debug, etc
Также полезно следующее:
#define UNUSED_FUNCTION(x) inline static x##_UNUSED // "inline" for GCC warning
#define SUPPRESS_UNUSED_WARNING(x) (void)(x) // cf. MSVC UNREFERENCED_PARAMETER
Примеры:
UNUSED_FUNCTION(int myFunction)(int myArg) { ...etc... }
и:
void foo(int bar) {
#ifdef XXX
// ... (some code using bar)
#else
SUPPRESS_UNUSED_WARNING(bar);
#endif
}