编译时检测不推荐的API调用?

cac*_*cau 5 c++ boost static-assert c++11

C++ 11中是否有任何新的,很酷的功能允许我们在编译时检测现在标记为已弃用的API是否实际上被某人调用?

从我读到的关于新static_assert功能的内容来看,它似乎不够灵活,不能用于那种分析.

但是还有什么我们可以使用的吗?

可选地,是否有任何提升允许这种编译时检查?

gal*_*p1n 6

使用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 );
}
Run Code Online (Sandbox Code Playgroud)

Clang给出了编译输出(这里):

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


Lig*_*ica 1

是否static_assert太不灵活取决于您未指定的要求,但如果您想禁止调用中已弃用的 API ,并且这些函数是模板,那么它是完美的。

更有可能的是,您希望在进行此类调用时发出某种纯粹的警告,并且据我所知,没有新的 C++11 功能可以做到这一点。

一般来说,C++ 不提供对特定编译器诊断/输出的细粒度控制,仅提供“可以编译”和“不能编译”(尽管这是一个粗略的过度简化,但原则成立)。

相反,您将需要依赖编译器特定的功能,例如__declspec__attribute__