Насколько я знаю, приведение между несовместимыми указателями функций, например:
void aUnaryFunction(int a1)
{
/* .... */
}
void doSomethingWithFn()
{
typedef void(*BinaryFn)(int, const char*);
BinaryFn aBinaryFunction = (BinaryFn) &aUnaryFunction;
aBinaryFunction (3, "!!!");
}
, никогда не должно выполняться, как и "неопределенное поведение" в соответствии со стандартом C.
ОднакоЯ не понимаю, почему, учитывая то, как в C работают вызовы функций, этот пример небезопасен.Все, что я делаю, это игнорирую аргумент.
Если предположить, что обработка первого аргумента int последовательна, все, что произойдет, это то, что const char * будет помещен в регистр, когда doSomethingWithFn()
вызывает aBinaryFunction
, aUnaryFunction
будет работать как положено, и const char * может быть перезаписан во время aUnaryFunction
, но это нормально, потому что ничто другое не будет его использовать в любом случае.
Я что-то здесь упустил, или этона самом деле безопасно?(Или что-то среднее между двумя или оба?)