2011-11-16 13 views
19

Estoy tratando de hacer que esto funcione (en GCC 4.6) sin ladrarme.Desactivar temporalmente la advertencia de gcc en la redefinición

#define FOO "" 
#define BAR "" 

#if .... 
    #define FOO "Foo, good sir" 
#endif 

#if ... 
    #define BAR "Bar, my lady" 
#endif 
.... 

#define EVERYTHING  FOO BAR ... 

voy a tener un montón de éstos. Así que hacerlo de esa manera en lugar de:

#if ... 
    #define FOO "Foo" 
#else 
    #define FOO "" 
#endif 

Guarda una gran cantidad de código y lo hace más legible. La advertencia que tengo es:

advertencia: "FOO" redefinido [activada de forma predeterminada]

¿Hay una manera de desactivar esta advertencia en el código de esta sección en particular? Encontré Diagnostic Pragmas para desactivar ciertas advertencias, pero no puedo encontrar qué advertencia (en esta lista de Options to Request or Suppress Warnings) necesita ser deshabilitada aquí.

¿Alguien sabe cómo hacer esto? O una forma diferente de evitar tener que #else #define todos ellos a la cadena vacía?

+8

Puede usar '-wp, -w' para desactivar [advertencias del preprocesador] (http://gcc.gnu.org/onlinedocs/cpp/Invocation.html#Invocation) – osgx

+1

Esta advertencia viene de Rusia Soviética archivo llamado "cccp.c" en gcc (a partir de la versión 2.95), y no se puede desactivar. Todavía no hay ninguna opción para desactivar esta advertencia individualmente [incluso en git head, gcc/libcpp/macro.c] (http://gcc.gnu.org/git/?p=gcc.git;a=blob;f= libcpp/macro.c; h = f3139590d5045b128709296d1abbb81753284f10; hb = HEAD # l2527) (y la línea 2994 del mismo archivo) – osgx

+0

@osgx Si hace una respuesta a ese comentario, me gustaría aceptarlo. –

Respuesta

6

Esta advertencia viene del archivo llamado "cccp.c" en gcc (en la versión 2.95, que es el archivo de "Rusia Soviética"?), Y no puede ser apagado Todavía no hay ninguna opción para desactivar esta advertencia individualmente, incluso en git head, gcc/libcpp/macro.c file (línea 2527 y line 2994 del mismo archivo)

Citaré las fuentes un poco.

2525 /* Returns nonzero if a macro redefinition warning is required. */ 
2526 static bool 
2527 warn_of_redefinition (cpp_reader *pfile, cpp_hashnode *node, 
2528      const cpp_macro *macro2) 
2529 { 
... 
2537 /* Suppress warnings for builtins that lack the NODE_WARN flag. */ 
.. 
2545 /* Redefinitions of conditional (context-sensitive) macros, on 
2546  the other hand, must be allowed silently. */ 
... 
2550 /* Redefinition of a macro is allowed if and only if the old and new 
2551  definitions are the same. (6.10.3 paragraph 2). */ 
... 
2561 /* Check parameter spellings. */ 
... 
2566 /* Check the replacement text or tokens. */ 
... 
2573 for (i = 0; i < macro1->count; i++) 
2574  if (!_cpp_equiv_tokens (&macro1->exp.tokens[i], &macro2->exp.tokens[i])) 
2575  return true; 

Por lo tanto, en su caso warn_of_redefinition función devolverá verdadero. Y aquí está el uso real:

2989 if (node->type == NT_MACRO) 
2990  { 
2991  if (CPP_OPTION (pfile, warn_unused_macros)) 
2992   _cpp_warn_if_unused_macro (pfile, node, NULL); 
2993 
2994  if (warn_of_redefinition (pfile, node, macro)) 
2995   { 
2996   const int reason = (node->flags & NODE_BUILTIN) 
2997        ? CPP_W_BUILTIN_MACRO_REDEFINED : CPP_W_NONE; 
2998   bool warned; 
2999 
3000   warned = cpp_pedwarning_with_line (pfile, reason, 
3001            pfile->directive_line, 0, 
3002            "\"%s\" redefined", 
3003            NODE_NAME (node)); 
3004 
3005   if (warned && node->type == NT_MACRO && !(node->flags & NODE_BUILTIN)) 
3006    cpp_error_with_line (pfile, CPP_DL_NOTE, 
3007         node->value.macro->line, 0, 
3008       "this is the location of the previous definition"); 
3009   } 
3010  } 

Por lo tanto, no hay ninguna opción específica. Y la respuesta de Greg es buena para este caso, solo defina la cadena vacía justo antes de la redefinición.

+9

En la Rusia soviética, ¡Macro te redefine! – einpoklum

31

Trate de usar #undef:

#define FOO "" 

#if .... 
    #undef FOO 
    #define FOO "Foo, good sir" 
#endif 
0

O intenta usar if else.

#if ... 
# define FOO "Foo, doof sir" 
#else 
# define FOO "" 
#endif 
Cuestiones relacionadas