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.