簡體   English   中英

將指針存儲在void *中的函數指針

[英]Storing the pointer to a function pointer in a void*

我明白你為什么不能這樣做:

void(*fp)(void) = &function;
function_taking_void_pointer((void*)fp);

因為類型的長度可能不同。

但是添加另一個間接層是否有任何問題:

void(*fp)(void) = &function;
void(**fpp)(void) = &fp;
function_taking_void_pointer((void*)fpp)

我在這背后的想法:指向函數指針的指針應指向數據存儲器,因此應該與void *類型具有相同的長度。

那我有多難?

你是對的,所有指針類型都是對象類型

N1570 6.3.5類型,第20段,第五個清單項目:

  • 指針類型可以從函數類型或對象類型派生 ,稱為引用類型。 指針類型描述一個對象,其值提供對引用類型的實體的引用。 從引用類型T派生的指針類型有時被稱為“指向T”的指針。 從引用類型構造指針類型稱為“指針類型派生”。 指針類型是完整的對象類型。

但是指向對象類型的指針不一定與void* (6.2.5 p28)具有相同的大小。

  1. 指向void的指針應具有與指向字符類型的指針相同的表示和對齊要求。 48)類似地,指向兼容類型的合格或非限定版本的指針應具有相同的表示和對齊要求。 所有指向結構類型的指針都應具有相同的表示和對齊要求。 所有指向union類型的指針都應具有相同的表示和對齊要求。 指向其他類型的指針不需要具有相同的表示或對齊要求。

但是,它們都可以轉換void* (6.3.2.3 p1):

  1. 指向void的指針可以轉換為指向任何對象類型的指針。 指向任何對象類型的指針可以轉換為指向void的指針,然后再返回; 結果應該等於原始指針。

此代碼段錯誤。

void(*fp)(void) = &function;
    function_taking_void_pointer((void*)fp);

在C / C ++中, function name將重定位到linking stage的特定地址,因此您不能在function name之前使用& 另外function name不是C / C ++中的變量,因此您也無法嘗試獲取其地址。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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