如何在Microsoft C编译器中禁止"注释C6311"?

piC*_*kie 1 visual-c++ c-preprocessor

在这个最大限幅剪辑的源示例中,正在重新定义清单常量FOOBAR.这是故意的,并且在实时案例中有额外的代码来使用每个定义.

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

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

#pragma warning( disable : 4005 ) // 'identifier' : macro redefinition
#define FOOBAR FOO
#define FOOBAR BAR
Run Code Online (Sandbox Code Playgroud)

编译器横幅和输出如下

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'
Run Code Online (Sandbox Code Playgroud)

Jam*_*lis 6

除非新定义与当前定义相同,否则不允许重新定义宏(如果重新定义宏并且新定义与当前定义不同,则程序实际上格式不正确).

#undef在重新定义之前使用宏是正确的做法:

#undef FOOBAR
#define FOOBAR FOO


#undef FOOBAR
#define FOOBAR BAR
Run Code Online (Sandbox Code Playgroud)

请注意,#undef即使当前未定义宏名称,也允许使用,因此没有理由#ifdef在使用宏之前测试宏是否已定义#undef.

  • @piCookie:你为什么要压制这个警告?编译器告诉您代码是_wrong_.代码应该修复,特别是因为修复非常简单. (4认同)
  • @Johannes:即使没有定义宏,你也可以`#undef`一个宏名,但_that_可能不是常识.我添加了一个证明这一点的例子; 谢谢. (2认同)