2015-07-21 3 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*){ }; 

объявляет переменную bar типа void(*)(A*), то есть «указатель на функцию, принимающую указатель на А и возвращение пустоты», и нулевой инициализирует это. Таким образом, это эквивалентно следующему:

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

Очевидно, что при вызове этой bar, выдаёт ошибку сегментации не должно быть сюрпризом.

Невозможно объявить функцию и указатель на эту функцию в одном объявлении.

+0

Вы уверены, что это то же самое, что установить его на 'nullptr'? переменные, инициализируемые по умолчанию, не устанавливали их в '0' столько, сколько я знал. Я бы подумал, что он указал на адрес мусора. – CoffeeandCode

+0

@CoffeeandCode: Это верно, если вы объявляете указатель без его инициализации. Но если вы * default-initialize * it, он обнуляется. –

+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 

это означает, что «бар» - это указатель на функцию, который может указывать на некоторую функцию, которая принимает параметр «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); 
} 
Смежные вопросы