我想测试源文件中常量的使用,如果使用了常量,请停止编译。
所讨论的常量在通用驱动程序文件中定义,许多驱动程序实现都继承自该文件。但是,已不赞成使用它,因此对每个驱动程序的后续更新应切换为使用新的方法调用,而不是使用此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)
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)
第二种方法显然不适用于预处理器宏。