结构的原型功能

Prototyped function of structs

本文关键字:功能 原型 结构      更新时间:2023-10-16

今天我遇到了一段代码:

int main() {
  struct Foo {};
  struct Bar {};
  Foo(b)(int (Bar*c)); // ?
  return 0;
}

我完全不知道发生了什么。我的编译器(VC14(警告我未使用的原型函数?

这行做什么(声明一个函数:哪个名称,什么参数和返回类型?如何调用它?(

Foo(b)(int (Bar*c));

提前谢谢你帮我!

这声明了一个名为b的函数:

  • 以CCD_ 2为自变量
  • 返回CCD_ 3

参数的类型int (Bar*c)是指向函数的指针,该函数接受指向Bar的指针并返回int。这里,c是参数的名称,可以省略:int (Bar*)

以下是如何调用b:

int main() {
  struct Foo {};
  struct Bar {};
  Foo(b)(int (Bar* c)); // the prototype in question
  int func(Bar*);       // a function defined elsewhere
  Foo result = b(func);
  return 0;
}

这不是有效的C(因为名称FooBar没有引用类型;您必须使用struct关键字或使用typedef(。

在C++中,这是一个令人惊讶但有效的声明。它将b声明为返回Foo并接受类型为"(指针到(函数返回int,接受类型为指针到Bar的参数"的函数。

为了生成可读的类型声明,我编写了以下代码:

#include <typeinfo>
#include <iostream>

int main() {
    struct Foo {};
    struct Bar {};
    Foo(b)(int (Bar*c));
    std::cout << typeid(b).name();
    return 0;
}

然后我编译了它,并通过c++filt过滤了它的输出。结果是:

main::Foo (int (*)(main::Bar*))

这是完全清楚的。

实际上,我的编译器(Clang 3.5(给了我以下警告:

警告:括号作为函数声明已消除歧义[-W解析]

这更切中要害,因为您正在处理最令人烦恼的解析。

以下声明:

Foo(b)(int (Bar*c));

声明一个指向返回Foo的函数并将返回int的函数作为自变量并将指向Bar的指针作为自变量的b函数指针(例如:int (Bar*c)(。

您的编译器可能认为这是一个函数的原型,因此发出警告。