如果源文件中使用了常量,如何使编译停止良好?

Mat*_*att 6 c++ visual-c++

我想测试源文件中常量的使用,如果使用了常量,请停止编译。

所讨论的常量在通用驱动程序文件中定义,许多驱动程序实现都继承自该文件。但是,已不赞成使用它,因此对每个驱动程序的后续更新应切换为使用新的方法调用,而不是使用此const值。

这显然行不通

#ifdef CONST_VAR
#error "custom message"
#endif
Run Code Online (Sandbox Code Playgroud)

我该如何优雅地做到这一点?因为这是一个整数,所以我可以将CONST_VAR定义为字符串并使它失败,但这可能会使开发人员难以理解实际出了什么问题。我希望收到一个不错的#error类型的消息。

有什么建议么?


毒药的答案在这里非常好。但是对于不支持[[deprecated]]的VC ++的较旧版本,我发现了以下工作。

使用[[deprecated]](C ++ 14编译器)或__declspec(deprecated)

要将此警告视为编译单元中的错误,请将以下编译指示放在源文件顶部附近。

#pragma warning(error: 4996)

例如

const int __declspec(deprecated) CLEAR_SOURCE = 0;
const int __declspec(deprecated("Use of this constant is deprecated. Use ClearFunc() instead. See: foobar.h"));
Run Code Online (Sandbox Code Playgroud)

PSk*_*cik 7

AFAIK,没有标准的方法可以执行此操作,但是gcc和clang的预处理器具有#pragma poison允许您执行此操作的功能-您将某些预处理器令牌(标识符,宏)声明为中毒,并且如果在预处理过程中遇到它们,编译中止。

#define foo
#pragma GCC poison printf sprintf fprintf foo
int main()
{
  sprintf(some_string, "hello"); //aborts compilation
  foo; //ditto
}
Run Code Online (Sandbox Code Playgroud)

对于预处理后的警告/错误,可以使用C ++ 14的[[deprecated]]属性,可以将其警告变成clang / gcc的错误-Werror=deprecated-declarations

int foo [[deprecated]];
[[deprecated]] int bar ();

int main()
{
    return bar()+foo;
}
Run Code Online (Sandbox Code Playgroud)

第二种方法显然不适用于预处理器宏。