【问题标题】:How do I inhibit "note C6311" in Microsoft C compiler?如何在 Microsoft C 编译器中禁止“note C6311”?
【发布时间】:2010-04-20 16:23:14
【问题描述】:

在这个最大裁剪源示例中,清单常量 FOOBAR 正在重新定义。这是经过深思熟虑的,在 live case 中有额外的代码来使用每个定义。

添加了 pragma 是为了摆脱警告消息,但随后出现了一个注释,我似乎没有找到摆脱该注释的方法。

我已经能够在#define 之间将这个特定的源修改为#undef,但我想知道是否有一种方法可以在不需要#undef 的情况下禁止注释,因为要处理多个常量同样的方式。

#pragma warning( disable : 4005 ) // 'identifier' : macro redefinition
#define FOOBAR FOO
#define FOOBAR BAR

编译器横幅和输出如下

Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

message.c
message.c(3) : note C6311: message.c(2) : see previous definition of 'FOOBAR'

【问题讨论】:

  • @James:您似乎已经编辑了标签以将“c”重命名为“c++”并拥有“visual-c++”,但这与任何视觉都无关。此外,您删除了 Microsoft 标记,因为这个问题与编译器和可用的#pragma 和选项特别相关,所以我觉得这是一个重要的标记。你至少同意“视觉”和“微软”标签吗?我喜欢预处理器标签。谢谢你。
  • 抱歉这么晚才回复;我没有看到您的评论(编辑/retagers 没有收到@username 通知)。 [visual-c++] 是“Microsoft C/C++ 优化编译器”的商品名,因此我用它替换了 microsoftcompiler。我并不是想将 c++ 换成 c;那是错误。我已经添加了c,但留下了c++,因为这个问题确实与使用哪个无关。

标签: visual-c++ c-preprocessor


【解决方案1】:

除非新定义与当前定义相同,否则不允许重新定义宏(如果重新定义宏并且新定义与当前定义不同,则程序实际上是非良构的)。

#undef在重新定义宏之前,在这种情况下是正确的做法:

#undef FOOBAR
#define FOOBAR FOO


#undef FOOBAR
#define FOOBAR BAR

请注意,即使当前未定义宏名称,您也可以使用#undef,因此没有理由在使用#undef 之前测试宏是否使用#ifdef 定义。

【讨论】:

  • 我从 N1124 知道,6.10.3 / 2 就是这么说的。由于 C 编译器只发出可以被禁止的警告,我希望有另一种方法来禁止以下注释。
  • @piCookie:你为什么要取消这个警告?编译器告诉您您的代码错误。代码应该被修复,特别是因为修复真的很容易。
  • 也许他不知道#ifdef
  • @Johannes:即使未定义宏,您也可以#undef 宏名称,但可能不是常识。我添加了一个示例来证明这一点;谢谢。
  • @James,啊不知道。谢谢你启发我。
猜你喜欢
  • 1970-01-01
  • 2010-10-06
  • 1970-01-01
  • 2010-11-15
  • 2012-02-12
  • 2018-04-14
  • 2021-02-22
  • 1970-01-01
  • 2023-01-24
相关资源
最近更新 更多