2015-07-21 93 views
0

我怎么如下定义声明的:声明函数指针

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

回答

-1

要声明的实际功能,摆脱周围的函数名(*)部分:

void bar(A*){ std::cout << "foo" << std::endl }; 

https://ideone.com/UPIYxg

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

这只是一条评论。

+0

我认为他意味着整条线,而不仅仅是“// 1”。这是一个空分配/初始化。 – CoffeeandCode

+0

这是否甚至编译?当然它必须是'(A * a)'? –

+1

@ M.Shaw,您可以拥有未命名的参数 - 完全合法。 – Alejandro

4

本声明:

void (*bar)(A*){ }; 

声明了一个名为void(*)(A*)bar变量,即“函数指针采取指针,并返回void”,并零初始化它。因此,它是相同的:

void (*bar)(A*) = nullptr; 

显然,调用此bar时,段错误应该是毫不奇怪。

在单个声明中声明函数和指向该函数的指针是不可能的。

+0

你确定它是否设置为'nullptr'?只要我知道,默认初始化变量没有将它们设置为“0”。我曾以为它指向一个垃圾地址。 – CoffeeandCode

+0

@CoffeeandCode:如果你声明一个没有初始化它的指针,这是真的。但是,如果你*默认初始化*它,它被归零。 –

+1

默认初始化与不初始化不同。 – celticminstrel

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); 
} 
0

当你说

void (*bar)(A*){ }; //1 

这意味着“bar”是一个函数指针,它可以指向某个以“A *”为参数的函数。

就你而言,它并没有指向任何功能。 使其工作使用,

void (*bar)(A*) = foo; 
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); 
}