结构的原型功能
Prototyped function of structs
今天我遇到了一段代码:
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(因为名称Foo
和Bar
没有引用类型;您必须使用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)
(。
您的编译器可能认为这是一个函数的原型,因此发出警告。