如何理解 C++ 中的 _Function_class_(name)

All*_*ang 5 c++ annotations function visual-c++

我正在阅读一些 VC++ 代码并看到此函数注释的一些用法_Function_class_(name)

\n\n

根据MSDN

\n\n
\n

name 参数是由用户指定的任意字符串。它存在于与其他命名空间不同的命名空间中。函数、函数指针或最有用的函数指针类型可以被指定为属于一个或多个函数类。

\n
\n\n

但是,我仍然无法理解应该在什么场景下使用它,以及它对函数到底意味着什么。有人可以解释一下吗?

\n\n

谢谢

\n

Jam*_*lis 5

此注释允许您限制可以在给定上下文中使用的函数集。通常,当使用函数指针和函数引用时,您可以绑定这些指针和引用以引用具有正确类型的任何函数。

在某些情况下,您可能只希望该类型的一组受限函数在给定上下文中可用,或者您可能希望确保某人确实确实想要在该上下文中使用特定函数。例如,如果您采用指向回调函数的指针,并且对该回调内部可以执行的操作存在限制,则可以使用此属性来帮助开发人员在将新函数作为回调传递时考虑这些限制。

考虑以下示例: f被注释为属于special_fp_type函数类。 g具有相同的类型,因此它可以在与 相同的上下文中使用f,但它没有注释为属于special_fp_type函数类:

#include <sal.h>

typedef _Function_class_(special_fp_type) void (*special_fp_type)();

void _Function_class_(special_fp_type) f() { }
void g() { }

void call_special_function(special_fp_type) { }

int main()
{
    call_special_function(f);
    call_special_function(g);
}
Run Code Online (Sandbox Code Playgroud)

如果您使用 编译它/analyze,您将收到有关此处使用的有用警告g,告诉您它不是预期函数类的一部分:

警告 C28023:正在分配或传递的函数应_Function_class_至少具有以下类之一的注释:“ special_fp_type”:

通常,当仅使用一个函数类时,这是由于未将回调声明为适当的类型而导致的。