C++ 编译时检测不推荐的API调用?
C++11中是否有任何新的、很酷的特性允许我们在编译时检测现在标记为不推荐的API是否真的被某人调用了 从我读到的关于新的C++ 编译时检测不推荐的API调用?,c++,boost,c++11,static-assert,C++,Boost,C++11,Static Assert,C++11中是否有任何新的、很酷的特性允许我们在编译时检测现在标记为不推荐的API是否真的被某人调用了 从我读到的关于新的static\u assert特性的内容来看,它似乎不够灵活,无法用于这种分析 但是我们还有什么可以用的吗 或者,boost中是否有允许这种编译时检查的功能?静态断言是否太死板取决于您尚未指定的需求,但是如果您不允许调用库中不推荐的API,并且这些函数都是模板,那么这是完美的 在进行此类调用时,您更可能希望发出某种警告,据我所知,没有新的C++11功能可以做到这一点。 一般来
static\u assert
特性的内容来看,它似乎不够灵活,无法用于这种分析
但是我们还有什么可以用的吗
或者,boost中是否有允许这种编译时检查的功能?静态断言是否太死板取决于您尚未指定的需求,但是如果您不允许调用库中不推荐的API,并且这些函数都是模板,那么这是完美的 在进行此类调用时,您更可能希望发出某种警告,据我所知,没有新的C++11功能可以做到这一点。 一般来说,C++不提供细粒度控制特定编译器的诊断/输出,只有“可以编译”和“不能编译”(虽然这是一个粗略的简化,原则上是成立的)。
这不是特定于语言的特性,而是特定于编译器的特性
如果API调用被标记为已弃用,则编译器应发出警告通知您。使用C++14,您将有以下选项:
#include <iostream>
void foo( int v ) { std::cout << v << " "; }
[[deprecated("foo with float is deprecated")]]
void foo( float v ) { std::cout << v << " "; }
[[deprecated("you should not use counter anymore")]]
int counter {};
int main() {
foo( ++counter );
foo( 3.14f );
}
#包括
空富(国际五){std::cout标记为不推荐如何?来自@TheOne的评论是一个很好的解决方案。@melak47为模糊感到抱歉-好吧,让我们假设已经做出决定,不再使用API调用,同时保持二进制兼容性。因此,我想某种编译时通知机制是我们正在寻找的。。嗯,那么有什么办法呢g这会阻止编译-但只有在API方法确实被某人调用的情况下才可以?@cacau:删除该函数。(你不再真正谈论弃用了。)幸运的是,我们将在C++1y中获得[[deprecated]]
,[dcl.attr.deprecated]@dyp:确实如此。等不及了!如果您选择将警告视为错误,则此警告将导致编译失败?
main.cpp:12:10: warning: 'counter' is deprecated [-Wdeprecated-declarations]
foo( ++counter );
^
main.cpp:9:5: note: 'counter' has been explicitly marked deprecated here
int counter {};
^
main.cpp:13:3: warning: 'foo' is deprecated [-Wdeprecated-declarations]
foo( 3.14f );
^
main.cpp:6:6: note: 'foo' has been explicitly marked deprecated here
void foo( float v ) { std::cout << v << " "; }
^
2 warnings generated.