Параметр приведения указателя на функцию void - PullRequest
0 голосов
/ 10 ноября 2018

Я написал простую демонстрацию (test.cpp) для моего вопроса:

#include <stdio.h>
typedef void* (*SEL)(void);

int foo(int a, int b, int c) {
    return a + b + c;
}

SEL _ptr_to_foo() {
    return (SEL)foo;
}
int main() {
    SEL sel = _ptr_to_foo();

    return 0;
}

и я скомпилировал его с g++ test.cpp -o test в моем osx и компиляторы ничего не жаловали.

Но я не понимаю, что здесь произошло. На мой взгляд, SEL определяет указатель на функцию, параметром которой является void и возвращает void*. Однако функция foo должна быть функцией, которая принимает три параметра типа int и возвращает int в качестве результата. Я думаю, что указатель на функцию foo должен быть объявлен как int (*ptr)(int, int, int) = foo;. Почему кастинг в _ptr_to_foo работает? Что здесь произошло?

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Вы можете сохранить указатели функций как неправильный тип указателя функции.

Если вы вызываете их как неправильный тип указателя на функцию, поведение вашей программы становится неопределенным в соответствии со стандартом C ++.

Использование вами стиля C превращается в reinterpret_cast<SEL>, что может делать очень небезопасные вещи.

0 голосов
/ 10 ноября 2018

броски в c-стиле довольно слабы в проверке типов. Вы должны использовать static_cast вместо этого. Не удается скомпилировать:

return static_cast<SEL>(foo);
...