0

Что означает "typedef void (*Something)()" в C/C++?

16

Я пытаюсь разобраться в следующем коде, с которым работаю. В файле с расширением .h есть следующий фрагмент:

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

А в файле с расширением .C присутствует:

MCB Modes::m_process = NULL;

Иногда, когда я вызываю функцию:

m_process();

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

5 ответ(ов)

0

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

typedef void (*MCB)(void);

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

0

Давайте приведем пример:

typedef void (*pt2fn)(int);

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

pt2fn kk;

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

Ссылка: NYU CSCI-GA.3033-014

0

Вы можете создать новый тип указателя на функцию, который будет указывать на функцию, возвращающую ничего (void) и не принимающую никаких параметров. Для этого вы можете использовать следующий код на языке C:

typedef void (*MCB)();

Здесь MCB — это новый тип, который представляет собой указатель на функцию, соответствующую описанным условиям. Вы можете использовать этот тип, чтобы объявлять переменные, которые будут указывать на функции с такой сигнатурой. Например:

void myFunction() {
    // Ваш код здесь
}

MCB myFunctionPtr = myFunction; // Присваиваем указателю функцию

Теперь myFunctionPtr указывает на myFunction, и вы можете вызвать её через указатель следующим образом:

myFunctionPtr(); // Вызов функции

Таким образом, вы успешно определили и использовали указатель на функцию с заданной сигнатурой.

0

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

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

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

0

Это указатель на функцию. Вы получаете ошибку сегментации (SEGMENTATION FAULT), потому что пытаетесь вызвать функцию, адрес которой недействителен (равен NULL).

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

Вот как это должно выглядеть:

#include <stdio.h>

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

int main(int argc, char** argv)
{
    void (*m_process)() = a; // Объявляем указатель на функцию и инициализируем его
    m_process(); /* косвенный вызов функции "a" */
    // Hello!
    return 0;
}

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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь