據我所知有型,不兼容的函數指針之間的鑄造,如:鑄造函數指針,以接受更多的參數
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
期間被覆蓋,但這很好,因爲無論如何沒有別的東西會使用它。
我在這裏錯過了什麼,或者這實際上是安全的嗎? (或兩者之間或兩者之間的東西?)