2011-11-16 6 views
19

J'essaie de faire ce travail (dans GCC 4.6) sans m'aboyer.Désactiver temporairement l'avertissement GCC sur la redéfinition

#define FOO "" 
#define BAR "" 

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

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

#define EVERYTHING  FOO BAR ... 

Je vais avoir beaucoup de ces derniers. Ainsi, au lieu de:

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

Enregistre beaucoup de code et le rend plus lisible. L'avertissement que je reçois est:

avertissement: « FOO » redéfini [activé par défaut]

est-il un moyen de désactiver cet avertissement dans le code pour cette section particulière? J'ai trouvé Diagnostic Pragmas pour désactiver certains avertissements, mais je ne suis pas en mesure de trouver quel avertissement (dans cette liste de Options to Request or Suppress Warnings) qui doit être désactivé ici.

Quelqu'un sait-il comment faire? Ou une façon différente d'éviter d'avoir #else #define tous à la chaîne vide?

+8

Vous pouvez utiliser '-Wp, -w' pour désactiver [avertissements préprocesseur] (http://gcc.gnu.org/onlinedocs/cpp/Invocation.html#Invocation) – osgx

+1

Cet avertissement provient de la Russie soviétique fichier nommé "cccp.c" dans gcc (à partir de la version 2.95), et il ne peut pas être désactivé. Il n'y a toujours pas d'option pour désactiver cet avertissement individuellement [même dans 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) (et la ligne 2994 du même fichier) – osgx

+0

@osgx si vous faites de ce commentaire une réponse, je voudrais l'accepter. –

Répondre

6

Cet avertissement vient du fichier nommé « cccp.c » dans gcc (à partir de la version 2.95, est-ce fichier de « la Russie soviétique »?), Et il ne peut pas être éteint. Il n'y a toujours pas d'option pour désactiver cet avertissement individuellement même en tête git, gcc/libcpp/macro.c file (ligne 2527 et line 2994 du même fichier)

Je citerai un peu les sources.

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; 

Dans votre cas, la fonction warn_of_redefinition retournera true. Et voici une utilisation réelle:

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  } 

Donc, il n'y a pas d'option spécifique. Et la réponse de Greg est bonne pour ce cas, il vous suffit de ne pas définir votre chaîne vide juste avant la redéfinition.

+9

En Russie soviétique, Macro vous redéfinit! – einpoklum

31

Essayez d'utiliser #undef:

#define FOO "" 

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

Ou essayez d'utiliser si ailleurs.

#if ... 
# define FOO "Foo, doof sir" 
#else 
# define FOO "" 
#endif 
Questions connexes