Desactivar temporalmente la advertencia de gcc en la redefinición
c-preprocessor (3)
Esta advertencia proviene del archivo llamado "cccp.c" en gcc (a partir de la versión 2.95; ¿es este archivo de la "Rusia soviética"?), Y no se puede desactivar. Todavía no hay opción para deshabilitar esta advertencia individualmente, incluso en git head, gcc / libcpp / macro.c (línea 2527 y línea 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 (¯o1->exp.tokens[i], ¯o2->exp.tokens[i]))
2575 return true;
Entonces, en su caso, la función warn_of_redefinition
devolverá true. 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, simplemente defina su cadena vacía justo antes de la redefinición.
Estoy tratando de hacer que esto funcione (en GCC 4.6) sin ladrarme.
#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 muchos de estos. Así que hacerlo de esa manera en lugar de:
#if ...
#define FOO "Foo"
#else
#define FOO ""
#endif
Guarda un montón de código, y lo hace más legible. La advertencia que recibo es:
advertencia: "FOO" redefinido [habilitado de forma predeterminada]
¿Hay alguna manera de deshabilitar esta advertencia en el código de esta sección en particular? Encontré Pragmas de diagnóstico para deshabilitar ciertas advertencias, pero no puedo encontrar qué advertencia (en esta lista de Opciones para solicitar o suprimir advertencias ) que se debe deshabilitar aquí.
Alguien sabe cómo hacer esto? ¿O una forma diferente de evitar tener que #else #define
todos ellos a la cadena vacía?
Intente usar #undef
:
#define FOO ""
#if ....
#undef FOO
#define FOO "Foo, good sir"
#endif
O intente usar si otra cosa.
#if ...
# define FOO "Foo, doof sir"
#else
# define FOO ""
#endif