[英]Auto cast of void* argument in function pointer
以下代碼工作正常,但是我想知道這是否是對 void* 與任何其他指針兼容的規則的有效使用
#include <stdio.h>
typedef struct {
int foo;
} SomeStruct_t;
typedef void(*SomeFunction_t)(void* ptr);
void bar(SomeStruct_t* str) {
printf("%d\n", str->foo);
}
void teddy(void* anyPtr) {
SomeStruct_t* str = (SomeStruct_t*)anyPtr;
printf("%d\n", str->foo);
}
int main()
{
SomeFunction_t functPtr = (SomeFunction_t)bar;
SomeStruct_t data = {.foo = 33};
functPtr(&data);
functPtr = teddy;
functPtr(&data);
return 0;
}
問題是,我應該使用bar
還是teddy
變體? 我更喜歡bar
但我不確定在某些極端情況下這是否會導致難以檢測到的問題。
這是無效的:
SomeFunction_t functPtr = (SomeFunction_t)bar;
因為您將void (*)(SomeStruct_t*)
類型的 function 指針封裝為void (*)(void*)
類型,然后通過強制類型調用它。 function 指針類型不兼容,因為參數不兼容。 這會觸發未定義的行為。
雖然SomeStruct_t *
可以轉換為void *
,但這種轉換不會發生,因為強制轉換的 function 指針會阻止它。 不能保證SomeStruct_t *
和void *
具有相同的表示。
使用與 function 指針類型匹配的 function teddy
是安全的。 此外,您不需要在 function 中將參數強制轉換為SomeStruct_t *
,因為在大多數情況下,與void *
的轉換不需要一個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.