gpt4 book ai didi

gcc - 临时禁用重新定义时的 gcc 警告

转载 作者:行者123 更新时间:2023-12-03 11:09:23 24 4
gpt4 key购买 nike

我正在努力使这项工作(在 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

节省了大量代码,并使其更具可读性。我得到的警告是:

warning: "FOO" redefined [enabled by default]



有没有办法在此特定部分的代码中禁用此警告?我找到了 Diagnostic Pragmas禁用某些警告,但我无法在此处找到需要禁用的警告(在 Options to Request or Suppress Warnings 的此列表中)。

有人知道怎么做吗?或者另一种方式来避免必须 #else #define所有这些都到空字符串?

最佳答案

此警告来自 gcc 中名为“cccp.c”的文件(截至 2.95 版本;此文件来自“苏联”吗?),并且无法关闭。即使在 git head 中,仍然没有选项可以单独禁用此警告,gcc/libcpp/macro.c file (同一文件的第 2527 行和 line 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 }

所以,没有任何特定的选择。 Greg 的回答对这种情况很有用,只需在重新定义之前取消定义您的空字符串。

关于gcc - 临时禁用重新定义时的 gcc 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8159978/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com