Подтвердить что ты не робот

Временно отключить предупреждение gcc при переопределении

Я пытаюсь сделать эту работу (в GCC 4.6) без лая на меня.

#define FOO  ""
#define BAR  ""

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

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

#define EVERYTHING      FOO BAR ...

У меня будет много. Так что делайте это так, а не:

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

Сохраняет много кода и делает его более читаемым. Предупреждение, которое я получаю:

предупреждение: "FOO" переопределено [включено по умолчанию]

Есть ли способ отключить это предупреждение в коде для данного раздела? Я нашел Diagnostic Pragmas, чтобы отключить определенные предупреждения, но я не могу найти, какое предупреждение (в этом списке Параметры запроса или подавления предупреждений), которые необходимо отключить здесь.

Кто-нибудь знает, как это сделать? Или другим способом избежать того, чтобы #else #define все они были в пустой строке?

4b9b3361

Ответ 1

Это предупреждение происходит из файла с именем "cccp.c" в gcc (начиная с версии 2.95, это файл из "Советской России"?), и его нельзя отключить. По-прежнему нет возможности отключить это предупреждение индивидуально даже в git head, gcc/libcpp/macro.c file (строка 2527 и строка 2994 того же файла)

Я немного приведу источники.

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;

Итак, в вашем случае функция warn_of_redefinition вернет true. И вот реальное использование:

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     }

Таким образом, нет никакой конкретной опции. И ответ Грега хорош для этого случая, просто определите свою пустую строку непосредственно перед переопределением.

Ответ 2

Попробуйте использовать #undef:

#define FOO ""

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

Ответ 3

Или попробуйте использовать if else.

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