C++ 编译时检测不推荐的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功能可以做到这一点。 一般来

C++11中是否有任何新的、很酷的特性允许我们在编译时检测现在标记为不推荐的API是否真的被某人调用了

从我读到的关于新的
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.