Что означает "typedef void (* Something) ()" - PullRequest
38 голосов
/ 21 октября 2010

Я пытаюсь понять, что это значит, код, на который я смотрю, имеет

в .ч

typedef void (*MCB)();
static MCB     m_process;

в .C

MCB Modes::m_process = NULL;

И иногда, когда я делаю

m_process();

Я получаю ошибку сегментации, возможно, это связано с тем, что память была освобождена, как я могу отладить ее после освобождения?

Надеюсь, мои вопросы понятны.

Ответы [ 5 ]

44 голосов
/ 21 октября 2010

Определяет тип указателя на функцию.Функции возвращают void, и список аргументов не определен, потому что вопрос (в настоящее время, но, возможно, ошибочно) помечен C;если бы он был помечен как C ++, функция вообще не принимала бы аргументов.Чтобы сделать его функцией без аргументов (в C), вы должны использовать:

typedef void (*MCB)(void);

Это одна из областей, где существует значительная разница между C, которая пока не требуетвсе функции, которые должны быть прототипированы перед определением или использованием, и C ++, что делает.

6 голосов
/ 21 октября 2010

Введен тип указателя на функцию, указывающий на функцию, не возвращающую ничего (void), не принимающую никаких параметров, и именующую новый тип MCB .

4 голосов
/ 21 октября 2010

typedef определяет MCB как тип указателя на функцию, которая не принимает аргументов и возвращает void.

Обратите внимание, что MCB Modes::m_process = NULL; - это C ++, а не C. Также в Cдействительно, typedef должен быть typedef void (*MCB)(void);.

Я не уверен, что вы подразумеваете под «память была освобождена».У вас есть статический указатель на функцию;функция не может быть освобождена.Самое большее, ваш указатель где-то был сброшен.Просто отладьте часы памяти на m_process.

3 голосов
/ 21 октября 2010

Это указатель на функцию.Вы получаете ОТСУТСТВИЕ СЕГМЕНТАЦИИ, потому что вы пытаетесь вызвать функцию, адрес которой недействителен (NULL).

В соответствии с вашим конкретным примером, функция не должна возвращать значение (void) ине должен получать параметры ().

Это должно работать:

void a()
{
    printf("Hello!");
}

int main(int arcg, char** argv)
{
    m_process = a;
    m_process(); /* indirect call to "a" function, */
    // Hello!
}

Функциональные указатели обычно используются для некоторой формы обработки событий в C. Это не единственное использование, хотя ...

1 голос
/ 22 сентября 2018

Давайте рассмотрим пример

typedef void (*pt2fn)(int);

Здесь мы определяем тип pt2fn.Переменные этого типа указывают на функции, которые принимают целое число в качестве аргумента и не возвращают никакого значения.

pt2fn kk;

Здесь kk - это переменная типа pt2fn, которая может указывать на любую функцию, которая принимаетцелое число в качестве входных данных и не возвращает никакого значения.

Ссылка: https://cs.nyu.edu/courses/spring12/CSCI-GA.3033-014/Assignment1/function_pointers.html

...