Приведение указателя на функцию с многоточием - PullRequest
7 голосов
/ 18 октября 2011

Рассмотрим следующую программу:

#include <iostream>

typedef void (*fptr)(...);

void foo(fptr func) {
    (*func)(12);
}

void bar(int x) {
    std::cout << "bar : " << x << std::endl;
}

int main() {
    foo(fptr(bar));
}

Это компилирует, запускает и печатает bar : 12 хотя бы на одном компиляторе :) Я обнаружил это в каком-то устаревшем коде, который я должен поддерживать, и мне интересно, безопасно ли это определено? *

bar не соответствует типу fptr, поэтому единственный способ заставить это работать - использовать небезопасное приведение. Я предполагаю, что это зависит от того, как многогранник - magic работает внутри, так это определено каким-то образом?

1 Ответ

9 голосов
/ 18 октября 2011

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

...