我用以下定义声明什么:
void (*bar)(A*){ }; //1
我的第一个想法是我声明并定义函数指针和指针所指向的函数。但这是错误的,因为对bar()
的任何调用都会导致分段错误:
#include <iostream>
#include <vector>
#include <memory>
struct A{ };
void foo(A*){ std:cout << "foo" << std::endl; }
void (*bar)(){ };
int main(){
bar();
}
此外,我无法在“定义”中嵌入任何声明:
void (*bar)(A*){ std::cout << "foo" << std::endl };
yeilds编译时错误。
那么,声明//1
是什么意思?
答案 0 :(得分:4)
本声明:
void (*bar)(A*){ };
声明一个名为bar
的{{1}}类型的变量,即&#34;指向函数的指针,指针指向A并返回void&#34;,零初始化它。因此,它等同于:
void(*)(A*)
显然,在调用此void (*bar)(A*) = nullptr;
时,段错误应该不足为奇。
在单个声明中无法声明函数和指向该函数的指针。
答案 1 :(得分:0)
这意味着你已经声明了一个当前没有指向任何内容的函数指针。您应该能够使用调试器验证它。
void (*bar)(A*){ }; //1
你可以使指针指向这样的函数:
void foo(A*){ std::cout << "foo" << std::endl };
bar = &foo;
现在就这样称呼它:
A a;
bar(&a);
完整摘录:
#include <iostream>
class A {};
void (*bar)(A*){};
void foo(A*) { std::cout << " foo " << std::endl;}
int main() {
A a;
bar = &foo;
bar(&a);
}
答案 2 :(得分:0)
当你说
时void (*bar)(A*){ }; //1
这意味着“bar”是一个函数指针,它可以指向某个以“A *”为参数的函数。
在你的情况下,它还没有指向任何功能。 使其有效,
void (*bar)(A*) = foo;
答案 3 :(得分:0)
您的代码应更改为以下代码。
#include <iostream>
#include <vector>
#include <memory>
struct A{ };
void foo(A*){ std::cout << "foo" << std::endl; }
void (*bar)(A*);
int main(){
A a;
bar = &foo;
bar(&a);
}
答案 4 :(得分:-1)
要声明实际函数,请删除函数名称周围的(*)
部分:
void bar(A*){ std::cout << "foo" << std::endl };
那么,声明
//1
是什么意思?
这只是一个评论。