c++ xcode visual-c++ clang suppress-warnings

c++ - macro de plataforma cruzada para silenciar las variables no utilizadas advertencia



xcode visual-c++ (3)

#define y #pragma son directivas de preprocesador. No puede definir una macro para expandirla como una directiva de preprocesador. Lo siguiente sería incorrecto:

#define MY_MACRO #if _WIN32

MY_MACRO no puede expandirse a #if _WIN32 para el compilador .

Su mejor apuesta es definir su propia macro:

#define UNUSED(_var) _var

Al trasladar una gran parte del código de C ++ de Visual Studio (2008) a Xcode (4.4+), encuentro líneas como:

UNUSED_ALWAYS(someVar);

la UNUSED_ALWAYS(x) (a través de UNUSED(x) ) se expande a x que parece silenciar a Visual C ++. Sin embargo, no es suficiente para Clang.

Con Clang, suelo usar la directiva #pragma unused x .

Las macros UNUSED_ALWAYS y UNUSED se definen en un encabezado artificial de windows.h que controlo que contiene varias utilidades para ayudar a Xcode a compilar cosas de Windows.

¿Hay alguna manera de definir UNUSED(x) para expandir a #pragma unused x ? Intenté esto, que Clang no acepta:

#define UNUSED(x) #pragma unused(x)

También probé:

#define UNUSED(x) (void)(x)

Lo cual parece funcionar. ¿Yo me perdí algo?


(void)x;

está bien; siempre me ha funcionado Normalmente no puede expandir una macro a #pragma, aunque generalmente hay una sintaxis de pragma ligeramente diferente que se puede generar a partir de una macro (_Pragma en gcc y clang, __pragma en VisualC ++).

Aún así, en realidad ya no necesito el (vacío) x en C ++, ya que simplemente no puede dar un nombre a un parámetro de función para indicar que no lo usa:

int Example(int, int b, int) { ... /* only uses b */ }

funciona perfectamente bien


Sí, puedes usar este enfoque para GCC y Clang:

#define MON_Internal_UnusedStringify(macro_arg_string_literal) #macro_arg_string_literal #define MONUnusedParameter(macro_arg_parameter) _Pragma(MON_Internal_UnusedStringify(unused(macro_arg_parameter)))

aunque el mío tenía el enfoque (void) definido para clang, parece que Clang ahora admite el enfoque de stringify y _Pragma anterior. _Pragma es C99.