2011-11-16 13 views
19

Próbuję wykonać tę pracę (w GCC 4.6) bez szczekania na mnie.Tymczasowo wyłącz ostrzeżenie gcc o ponownym zdefiniowaniu

#define FOO "" 
#define BAR "" 

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

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

#define EVERYTHING  FOO BAR ... 

będę mieć dużo z nich. Robiąc to w ten sposób, zamiast:

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

Zapisuje dużo kodu i czyni go bardziej czytelnym. Ostrzeżenie to pojawia się:

ostrzeżenie: „FOO” zreformowanego [domyślnie włączona]

Czy istnieje sposób, aby wyłączyć to ostrzeżenie w kodzie dla tej konkretnej części? Znalazłem Diagnostic Pragmas, aby wyłączyć niektóre ostrzeżenia, ale nie jestem w stanie znaleźć ostrzeżenia (na tej liście Options to Request or Suppress Warnings), które należy tutaj wyłączyć.

Ktoś wie, jak to zrobić? Lub w inny sposób, aby uniknąć konieczności ich całkowitego usunięcia z pustymi ciągami znaków?

+8

Można użyć '-WP, -w' wyłączyć [ostrzeżenia preprocesora] (http://gcc.gnu.org/onlinedocs/cpp/Invocation.html#Invocation) – osgx

+1

To ostrzeżenie pochodzi od radzieckiego rosyjskim plik o nazwie "cccp.c" w gcc (wersja 2.95) i nie można go wyłączyć. Wciąż nie ma opcji, aby wyłączyć to ostrzeżenie indywidualnie [nawet w 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) (i wiersz 2994 tego samego pliku) – osgx

+0

@osgx jeśli nadasz temu komentarzowi odpowiedź, chciałbym to zaakceptować. –

Odpowiedz

6

To ostrzeżenie pochodzi z pliku o nazwie „cccp.c” w gcc (od wersji 2.95; jest to plik „sowieckiej Rosji”?), I nie może być wyłączone. Wciąż nie ma możliwości wyłączenia tego ostrzeżenia indywidualnie, nawet w git head, gcc/libcpp/macro.c file (linia 2527 i line 2994 tego samego pliku)

Przytoczę trochę źródła.

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; 

Tak więc w twoim przypadku warn_of_redefinition funkcja zwróci wartość true. I tutaj jest prawdziwe użycie:

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  } 

Tak więc, nie ma żadnej konkretnej opcji. Odpowiedź Grega jest dobra dla tej sprawy, po prostu niezdefiniuj pusty łańcuch tuż przed redefinicją.

+9

W Związku Radzieckim Macro przedefiniowuje CIEBIE! – einpoklum

31

Spróbuj użyć #undef:

#define FOO "" 

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

Lub spróbuj użyć, jeśli jeszcze.

#if ... 
# define FOO "Foo, doof sir" 
#else 
# define FOO "" 
#endif 
Powiązane problemy