Временно отключить предупреждение gcc при переопределении - PullRequest
22 голосов
/ 17 ноября 2011

Я пытаюсь заставить эту работу (в 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" переопределено [включено по умолчанию]

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

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

Ответы [ 3 ]

36 голосов
/ 17 ноября 2011

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

#define FOO ""

#if ....
    #undef FOO
    #define FOO "Foo, good sir"
#endif
7 голосов
/ 09 декабря 2011

Это предупреждение приходит из файла с именем "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     }

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

0 голосов
/ 30 июля 2017

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

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