声明函数指针

时间:2015-07-21 04:35:51

标签: c++ function pointers

我用以下定义声明什么:

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是什么意思?

5 个答案:

答案 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 };

https://ideone.com/UPIYxg

  

那么,声明//1是什么意思?

这只是一个评论。