Тип указателя на функцию нельзя использовать для прототипа функции - PullRequest
2 голосов
/ 12 апреля 2019

Я хотел бы знать, почему не работает следующий фрагмент:

typedef void (*MYFUNC_PTR)(int a);
MYFUNC_PTR myFunc;

void myFunc(int a)
{

}

Я использую Microsoft Visual Studio 2017. Исходный файл - ".c", но я пытался сделать то же самое с".cpp".Я получаю сообщение об ошибке:

Error   C2365   'myFunc': redefinition; previous definition was 'data variable' 

ПРИМЕЧАНИЕ. Я предполагал, что этот код будет работать, поскольку Microsoft упоминает похожий фрагмент (который тоже не работает, как я тоже проверял), например здесь .

РЕДАКТИРОВАТЬ: Я думал, может быть, это работает только в одном из новых стандартов C ++, но это не так, как я пытался C ++ 17.

Ответы [ 2 ]

2 голосов
/ 12 апреля 2019

Проблема в том, что тип myFunc является указателем на функцию, а не функцией.После этого вы определяете myFunc как функцию (конечно), они не совпадают.

Вы можете изменить typedef для MYFUNC_PTR на функцию, затем

typedef void(MYFUNC_PTR)(int a);
MYFUNC_PTR myFunc;
void myFunc(int a)
{

}

LIVE

2 голосов
/ 12 апреля 2019

Указатель на функцию - это не то же самое, что объявление функции, так что это просто не работает.Вы можете сделать это, однако:

typedef void(*MYFUNC_PTR)(int a);
MYFUNC_PTR myFunc;

void someFunc(int a)
{

}

int main() {
    myFunc = someFunc;
    return 0;
}
...