Что означает "typedef void (*Something)()" в C/C++?
Я пытаюсь разобраться в следующем коде, с которым работаю. В файле с расширением .h
есть следующий фрагмент:
typedef void (*MCB)();
static MCB m_process;
А в файле с расширением .C
присутствует:
MCB Modes::m_process = NULL;
Иногда, когда я вызываю функцию:
m_process();
у меня возникает ошибка сегментации. Я могу предположить, что это происходит из-за того, что память была освобождена. Как я могу отладить код, чтобы узнать, когда память освобождается?
5 ответ(ов)
Это определяет тип указателя на функцию. Эти функции возвращают void
, а список аргументов не указан, потому что вопрос (в данный момент, но возможно ошибочно) помечен тегом C; если бы он был помечен тегом C++, то функция не принимала бы никаких аргументов. Чтобы сделать функцию, которая не принимает аргументы (в C), вы бы использовали:
typedef void (*MCB)(void);
Это одна из областей, где существует значительная разница между C, который пока не требует, чтобы все функции были прототипированы перед определением или использованием, и C++, который это требует.
Давайте приведем пример:
typedef void (*pt2fn)(int);
Здесь мы определяем новый тип pt2fn
. Переменные этого типа указывают на функции, которые принимают целое число в качестве аргумента и не возвращают никаких значений.
pt2fn kk;
В этом случае kk
— это переменная типа pt2fn
, которая может указывать на любую функцию, принимающую целое число в качестве входного параметра и не возвращающую значения.
Ссылка: NYU CSCI-GA.3033-014
Вы можете создать новый тип указателя на функцию, который будет указывать на функцию, возвращающую ничего (void) и не принимающую никаких параметров. Для этого вы можете использовать следующий код на языке C:
typedef void (*MCB)();
Здесь MCB
— это новый тип, который представляет собой указатель на функцию, соответствующую описанным условиям. Вы можете использовать этот тип, чтобы объявлять переменные, которые будут указывать на функции с такой сигнатурой. Например:
void myFunction() {
// Ваш код здесь
}
MCB myFunctionPtr = myFunction; // Присваиваем указателю функцию
Теперь myFunctionPtr
указывает на myFunction
, и вы можете вызвать её через указатель следующим образом:
myFunctionPtr(); // Вызов функции
Таким образом, вы успешно определили и использовали указатель на функцию с заданной сигнатурой.
typedef
определяет MCB
как тип указателя на функцию, которая не принимает аргументов и не возвращает значение (void
).
Обратите внимание, что MCB Modes::m_process = NULL;
является C++, а не C. Также в C typedef
действительно должен быть записан как typedef void (*MCB)(void);
.
Я не совсем понимаю, что вы имеете в виду под "память была освобождена". У вас есть статический указатель на функцию; функцию нельзя освободить. В лучшем случае, ваш указатель был сброшен где-то в коде. Попробуйте отладить, установив наблюдение за памятью на m_process
.
Это указатель на функцию. Вы получаете ошибку сегментации (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. Однако это не единственное их применение...
Разница между 'struct' и 'typedef struct' в C++?
Какова разница между 'typedef' и 'using'?
Как инициализировать приватные статические члены данных в заголовочном файле
Определение typedef для указателя на функцию?
Почему код явно вызывает статический метод через указатель, равный null?