簡體   English   中英

function 指針中的 void* 參數的自動轉換

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM