2011-11-16 19 views
19

Sto provando a farlo funzionare (in GCC 4.6) senza abbaiarmi.Disabilita temporaneamente l'avviso gcc sulla ridefinizione

#define FOO "" 
#define BAR "" 

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

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

#define EVERYTHING  FOO BAR ... 

ho intenzione di avere un sacco di questi. Così facendo invece di:

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

Salva un sacco di codice e lo rende più leggibile. L'avvertimento che ottengo è:

avvertimento: "FOO" ridefinito [abilitato di default]

C'è un modo per disattivare questo avviso nel codice per questa particolare sezione? Ho trovato Diagnostic Pragmas per disabilitare alcuni avvisi, ma non riesco a trovare quale avviso (in questo elenco di Options to Request or Suppress Warnings) che deve essere disabilitato qui.

Qualcuno sa come fare? O un modo diverso per evitare di doverli tutti #else #define nella stringa vuota?

+8

È possibile utilizzare '-WP, -w' per disattivare [avvertimenti del preprocessore] (http://gcc.gnu.org/onlinedocs/cpp/Invocation.html#Invocation) – osgx

+1

Il monito arriva dal russo sovietico file denominato "cccp.c" in gcc (a partire dalla versione 2.95), e non può essere disattivato. Non c'è ancora alcuna opzione per disattivare individualmente questo avviso [anche in 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) (e riga 2994 dello stesso file) – osgx

+0

@osgx se si risponde a tale commento, vorrei accettarlo. –

risposta

6

Questo avvertimento viene da file denominato "cccp.c" a gcc (a partire da 2,95 versione, è questo file da "Russia sovietica"?), E non può essere spento. Non esiste ancora alcuna opzione per disattivare individualmente questo avvertimento anche in Git Head, gcc/libcpp/macro.c file (riga 2527 e line 2994 dello stesso file)

Citerò un po 'le fonti.

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; 

Quindi nel tuo caso la funzione warn_of_redefinition restituirà true. Ed ecco l'uso reale:

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  } 

Quindi, non esiste alcuna opzione specifica. E la risposta di Greg è positiva per questo caso, basta indefinire la stringa vuota poco prima della ridefinizione.

+9

Nella Russia sovietica, Macro ridefinisce te! – einpoklum

31

Provare a utilizzare #undef:

#define FOO "" 

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

Oppure provare a utilizzare se altro.

#if ... 
# define FOO "Foo, doof sir" 
#else 
# define FOO "" 
#endif 
Problemi correlati